Skip to content

Commit 6365b69

Browse files
committed
Fixed #8588: Error doing nbackup when Database file name has extended ASCII chars
1 parent f015c28 commit 6365b69

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
@@ -298,6 +298,8 @@ class NBackup
298298
pr_error(status, "nbackup needs local access to database file");
299299
}
300300

301+
toSystem(decompress);
302+
toSystem(db);
301303
expandDatabaseName(db, dbname, NULL);
302304

303305
if (!uSvc->isService())
@@ -368,7 +370,7 @@ class NBackup
368370
void internal_unlock_database();
369371
void attach_database();
370372
void detach_database();
371-
string to_system(const PathName& from);
373+
void toSystem(AbstractString& from);
372374
void cleanHistory();
373375

374376
// Create/open database and backup
@@ -597,12 +599,10 @@ void NBackup::close_database()
597599
dbase = INVALID_HANDLE_VALUE;
598600
}
599601

600-
string NBackup::to_system(const PathName& from)
602+
void NBackup::toSystem(AbstractString& from)
601603
{
602-
string to = from.ToString();
603604
if (uSvc->utf8FileNames())
604-
ISC_utf8ToSystem(to);
605-
return to;
605+
ISC_utf8ToSystem(from);
606606
}
607607

608608

@@ -614,14 +614,13 @@ void NBackup::open_backup_scan()
614614
return;
615615
}
616616

617-
string nm = to_system(bakname);
618617
#ifdef WIN_NT
619-
backup = CreateFile(nm.c_str(), GENERIC_READ, 0,
618+
backup = CreateFile(bakname.c_str(), GENERIC_READ, 0,
620619
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
621620
if (backup != INVALID_HANDLE_VALUE)
622621
return;
623622
#else
624-
backup = os_utils::open(nm.c_str(), O_RDONLY | O_LARGEFILE);
623+
backup = os_utils::open(bakname.c_str(), O_RDONLY | O_LARGEFILE);
625624
if (backup >= 0)
626625
return;
627626
#endif
@@ -769,7 +768,6 @@ void NBackup::open_backup_decompress()
769768

770769
void NBackup::create_backup()
771770
{
772-
string nm = to_system(bakname);
773771
#ifdef WIN_NT
774772
if (bakname == "stdout") {
775773
backup = GetStdHandle(STD_OUTPUT_HANDLE);
@@ -784,7 +782,7 @@ void NBackup::create_backup()
784782
// avoids an issue where writing to a file across a network can occasionally
785783
// return ERROR_ACCESS_DENIED.
786784

787-
backup = CreateFile(nm.c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_DELETE,
785+
backup = CreateFile(bakname.c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_DELETE,
788786
NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
789787
}
790788
if (backup != INVALID_HANDLE_VALUE)
@@ -795,7 +793,7 @@ void NBackup::create_backup()
795793
backup = 1; // Posix file handle for stdout
796794
return;
797795
}
798-
backup = os_utils::open(nm.c_str(), O_WRONLY | O_CREAT | O_EXCL | O_LARGEFILE, 0660);
796+
backup = os_utils::open(bakname.c_str(), O_WRONLY | O_CREAT | O_EXCL | O_LARGEFILE, 0660);
799797
if (backup >= 0)
800798
return;
801799
#endif
@@ -1006,6 +1004,7 @@ void NBackup::attach_database()
10061004
}
10071005

10081006
ClumpletWriter dpb(ClumpletReader::dpbList, MAX_DPB_SIZE);
1007+
uSvc->fillDpb(dpb);
10091008

10101009
const unsigned char* authBlock;
10111010
unsigned int authBlockSize = uSvc->getAuthBlock(&authBlock);
@@ -1299,7 +1298,10 @@ void NBackup::backup_database(int level, Guid& guid, const PathName& fname)
12991298
detach_database();
13001299

13011300
if (fname.hasData())
1301+
{
13021302
bakname = fname;
1303+
toSystem(bakname);
1304+
}
13031305
else
13041306
{
13051307
// Let's generate nice new filename
@@ -1697,6 +1699,8 @@ void NBackup::restore_database(const BackupFiles& files, bool repl_seq, bool inc
16971699
fixup_database(repl_seq);
16981700
return;
16991701
}
1702+
toSystem(bakname);
1703+
17001704
// Never reaches this point when run as service
17011705
try {
17021706
fb_assert(!uSvc->isService());
@@ -1730,7 +1734,10 @@ void NBackup::restore_database(const BackupFiles& files, bool repl_seq, bool inc
17301734
return;
17311735
}
17321736
if (!inc_rest || curLevel)
1737+
{
17331738
bakname = files[curLevel - (inc_rest ? 1 : 0)];
1739+
toSystem(bakname);
1740+
}
17341741
if (!inc_rest || curLevel)
17351742
open_backup_scan();
17361743
}

0 commit comments

Comments
 (0)