Fossil SCM
Fix the temporary filename generator so that it does not get stuck in a loop. Ticket [006e1df642d6246a03].
Commit
d3a1663a09b0ee716aeb7ede7a762bf13ad9b532
Parent
11285096466c088…
1 file changed
+3
-1
+3
-1
| --- src/file.c | ||
| +++ src/file.c | ||
| @@ -672,10 +672,11 @@ | ||
| 672 | 672 | "abcdefghijklmnopqrstuvwxyz" |
| 673 | 673 | "ABCDEFGHIJKLMNOPQRSTUVWXYZ" |
| 674 | 674 | "0123456789"; |
| 675 | 675 | unsigned int i, j; |
| 676 | 676 | const char *zDir = "."; |
| 677 | + int cnt = 0; | |
| 677 | 678 | |
| 678 | 679 | for(i=0; i<sizeof(azDirs)/sizeof(azDirs[0]); i++){ |
| 679 | 680 | if( !file_isdir(azDirs[i]) ) continue; |
| 680 | 681 | zDir = azDirs[i]; |
| 681 | 682 | break; |
| @@ -687,18 +688,19 @@ | ||
| 687 | 688 | if( (strlen(zDir) + 17) >= (size_t)nBuf ){ |
| 688 | 689 | fossil_fatal("insufficient space for temporary filename"); |
| 689 | 690 | } |
| 690 | 691 | |
| 691 | 692 | do{ |
| 693 | + if( cnt++>20 ) fossil_panic("cannot generate a temporary filename"); | |
| 692 | 694 | sqlite3_snprintf(nBuf-17, zBuf, "%s/", zDir); |
| 693 | 695 | j = (int)strlen(zBuf); |
| 694 | 696 | sqlite3_randomness(15, &zBuf[j]); |
| 695 | 697 | for(i=0; i<15; i++, j++){ |
| 696 | 698 | zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ]; |
| 697 | 699 | } |
| 698 | 700 | zBuf[j] = 0; |
| 699 | - }while( file_size(zBuf)<0 ); | |
| 701 | + }while( file_size(zBuf)>=0 ); | |
| 700 | 702 | } |
| 701 | 703 | |
| 702 | 704 | |
| 703 | 705 | /* |
| 704 | 706 | ** Return true if a file named zName exists and has identical content |
| 705 | 707 |
| --- 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 |