Fossil SCM

Fix the temporary filename generator so that it does not get stuck in a loop. Ticket [006e1df642d6246a03].

drh 2011-06-17 13:37 trunk
Commit d3a1663a09b0ee716aeb7ede7a762bf13ad9b532
1 file changed +3 -1
+3 -1
--- src/file.c
+++ src/file.c
@@ -672,10 +672,11 @@
672672
"abcdefghijklmnopqrstuvwxyz"
673673
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
674674
"0123456789";
675675
unsigned int i, j;
676676
const char *zDir = ".";
677
+ int cnt = 0;
677678
678679
for(i=0; i<sizeof(azDirs)/sizeof(azDirs[0]); i++){
679680
if( !file_isdir(azDirs[i]) ) continue;
680681
zDir = azDirs[i];
681682
break;
@@ -687,18 +688,19 @@
687688
if( (strlen(zDir) + 17) >= (size_t)nBuf ){
688689
fossil_fatal("insufficient space for temporary filename");
689690
}
690691
691692
do{
693
+ if( cnt++>20 ) fossil_panic("cannot generate a temporary filename");
692694
sqlite3_snprintf(nBuf-17, zBuf, "%s/", zDir);
693695
j = (int)strlen(zBuf);
694696
sqlite3_randomness(15, &zBuf[j]);
695697
for(i=0; i<15; i++, j++){
696698
zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ];
697699
}
698700
zBuf[j] = 0;
699
- }while( file_size(zBuf)<0 );
701
+ }while( file_size(zBuf)>=0 );
700702
}
701703
702704
703705
/*
704706
** Return true if a file named zName exists and has identical content
705707
--- src/file.c
+++ src/file.c
@@ -672,10 +672,11 @@
672 "abcdefghijklmnopqrstuvwxyz"
673 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
674 "0123456789";
675 unsigned int i, j;
676 const char *zDir = ".";
 
677
678 for(i=0; i<sizeof(azDirs)/sizeof(azDirs[0]); i++){
679 if( !file_isdir(azDirs[i]) ) continue;
680 zDir = azDirs[i];
681 break;
@@ -687,18 +688,19 @@
687 if( (strlen(zDir) + 17) >= (size_t)nBuf ){
688 fossil_fatal("insufficient space for temporary filename");
689 }
690
691 do{
 
692 sqlite3_snprintf(nBuf-17, zBuf, "%s/", zDir);
693 j = (int)strlen(zBuf);
694 sqlite3_randomness(15, &zBuf[j]);
695 for(i=0; i<15; i++, j++){
696 zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ];
697 }
698 zBuf[j] = 0;
699 }while( file_size(zBuf)<0 );
700 }
701
702
703 /*
704 ** Return true if a file named zName exists and has identical content
705
--- src/file.c
+++ src/file.c
@@ -672,10 +672,11 @@
672 "abcdefghijklmnopqrstuvwxyz"
673 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
674 "0123456789";
675 unsigned int i, j;
676 const char *zDir = ".";
677 int cnt = 0;
678
679 for(i=0; i<sizeof(azDirs)/sizeof(azDirs[0]); i++){
680 if( !file_isdir(azDirs[i]) ) continue;
681 zDir = azDirs[i];
682 break;
@@ -687,18 +688,19 @@
688 if( (strlen(zDir) + 17) >= (size_t)nBuf ){
689 fossil_fatal("insufficient space for temporary filename");
690 }
691
692 do{
693 if( cnt++>20 ) fossil_panic("cannot generate a temporary filename");
694 sqlite3_snprintf(nBuf-17, zBuf, "%s/", zDir);
695 j = (int)strlen(zBuf);
696 sqlite3_randomness(15, &zBuf[j]);
697 for(i=0; i<15; i++, j++){
698 zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ];
699 }
700 zBuf[j] = 0;
701 }while( file_size(zBuf)>=0 );
702 }
703
704
705 /*
706 ** Return true if a file named zName exists and has identical content
707

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button