Skip to content

Commit 696fb1d

Browse files
committed
Fixed #8588: Error doing nbackup when Database file name has extended ASCII chars
1 parent 4374a59 commit 696fb1d

File tree

1 file changed

+18
-11
lines changed

1 file changed

+18
-11
lines changed

src/utilities/nbackup/nbackup.cpp

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,8 @@ class NBackup
296296
pr_error(status, "nbackup needs local access to database file");
297297
}
298298

299+
toSystem(decompress);
300+
toSystem(db);
299301
expandDatabaseName(db, dbname, NULL);
300302

301303
if (!uSvc->isService())
@@ -366,7 +368,7 @@ class NBackup
366368
void internal_unlock_database();
367369
void attach_database();
368370
void detach_database();
369-
string to_system(const PathName& from);
371+
void toSystem(AbstractString& from);
370372
void cleanHistory();
371373

372374
// Create/open database and backup
@@ -595,12 +597,10 @@ void NBackup::close_database()
595597
dbase = INVALID_HANDLE_VALUE;
596598
}
597599

598-
string NBackup::to_system(const PathName& from)
600+
void NBackup::toSystem(AbstractString& from)
599601
{
600-
string to = from.ToString();
601602
if (uSvc->utf8FileNames())
602-
ISC_utf8ToSystem(to);
603-
return to;
603+
ISC_utf8ToSystem(from);
604604
}
605605

606606

@@ -612,14 +612,13 @@ void NBackup::open_backup_scan()
612612
return;
613613
}
614614

615-
string nm = to_system(bakname);
616615
#ifdef WIN_NT
617-
backup = CreateFile(nm.c_str(), GENERIC_READ, 0,
616+
backup = CreateFile(bakname.c_str(), GENERIC_READ, 0,
618617
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
619618
if (backup != INVALID_HANDLE_VALUE)
620619
return;
621620
#else
622-
backup = os_utils::open(nm.c_str(), O_RDONLY | O_LARGEFILE);
621+
backup = os_utils::open(bakname.c_str(), O_RDONLY | O_LARGEFILE);
623622
if (backup >= 0)
624623
return;
625624
#endif
@@ -767,7 +766,6 @@ void NBackup::open_backup_decompress()
767766

768767
void NBackup::create_backup()
769768
{
770-
string nm = to_system(bakname);
771769
#ifdef WIN_NT
772770
if (bakname == "stdout") {
773771
backup = GetStdHandle(STD_OUTPUT_HANDLE);
@@ -782,7 +780,7 @@ void NBackup::create_backup()
782780
// avoids an issue where writing to a file across a network can occasionally
783781
// return ERROR_ACCESS_DENIED.
784782

785-
backup = CreateFile(nm.c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_DELETE,
783+
backup = CreateFile(bakname.c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_DELETE,
786784
NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
787785
}
788786
if (backup != INVALID_HANDLE_VALUE)
@@ -793,7 +791,7 @@ void NBackup::create_backup()
793791
backup = 1; // Posix file handle for stdout
794792
return;
795793
}
796-
backup = os_utils::open(nm.c_str(), O_WRONLY | O_CREAT | O_EXCL | O_LARGEFILE, 0660);
794+
backup = os_utils::open(bakname.c_str(), O_WRONLY | O_CREAT | O_EXCL | O_LARGEFILE, 0660);
797795
if (backup >= 0)
798796
return;
799797
#endif
@@ -1004,6 +1002,7 @@ void NBackup::attach_database()
10041002
}
10051003

10061004
ClumpletWriter dpb(ClumpletReader::dpbList, MAX_DPB_SIZE);
1005+
uSvc->fillDpb(dpb);
10071006

10081007
const unsigned char* authBlock;
10091008
unsigned int authBlockSize = uSvc->getAuthBlock(&authBlock);
@@ -1297,7 +1296,10 @@ void NBackup::backup_database(int level, Guid& guid, const PathName& fname)
12971296
detach_database();
12981297

12991298
if (fname.hasData())
1299+
{
13001300
bakname = fname;
1301+
toSystem(bakname);
1302+
}
13011303
else
13021304
{
13031305
// Let's generate nice new filename
@@ -1695,6 +1697,8 @@ void NBackup::restore_database(const BackupFiles& files, bool repl_seq, bool inc
16951697
fixup_database(repl_seq);
16961698
return;
16971699
}
1700+
toSystem(bakname);
1701+
16981702
// Never reaches this point when run as service
16991703
try {
17001704
fb_assert(!uSvc->isService());
@@ -1728,7 +1732,10 @@ void NBackup::restore_database(const BackupFiles& files, bool repl_seq, bool inc
17281732
return;
17291733
}
17301734
if (!inc_rest || curLevel)
1735+
{
17311736
bakname = files[curLevel - (inc_rest ? 1 : 0)];
1737+
toSystem(bakname);
1738+
}
17321739
if (!inc_rest || curLevel)
17331740
open_backup_scan();
17341741
}

0 commit comments

Comments
 (0)