Fossil SCM
Prevent buffer overrun when adding \r characters to the check-in descriptions for win32. Ticket [41bb23e650].
Commit
e44d7a4b5af0b66bf493ae55f0c8b71dc6ad46ed
Parent
efb759a07da0ea5…
1 file changed
+16
-16
+16
-16
| --- src/blob.c | ||
| +++ src/blob.c | ||
| @@ -836,35 +836,35 @@ | ||
| 836 | 836 | blob_reset(&b3); |
| 837 | 837 | } |
| 838 | 838 | printf("ok\n"); |
| 839 | 839 | } |
| 840 | 840 | |
| 841 | +#ifdef __MINGW32__ | |
| 841 | 842 | /* |
| 842 | 843 | ** Convert every \n character in the given blob into \r\n. |
| 843 | 844 | */ |
| 844 | 845 | void blob_add_cr(Blob *p){ |
| 845 | - int i, j, n; | |
| 846 | 846 | char *z = p->aData; |
| 847 | - for(i=n=0; i<p->nUsed; i++){ | |
| 847 | + int j = p->nUsed; | |
| 848 | + int i, n; | |
| 849 | + for(i=n=0; i<j; i++){ | |
| 848 | 850 | if( z[i]=='\n' ) n++; |
| 849 | 851 | } |
| 850 | - if( p->nUsed+n+1>p->nAlloc ){ | |
| 851 | - blob_resize(p, p->nUsed+n); | |
| 852 | + j += n; | |
| 853 | + if( j>=p->nAlloc ){ | |
| 854 | + blob_resize(p, j); | |
| 852 | 855 | z = p->aData; |
| 853 | 856 | } |
| 854 | - i = p->nUsed - 1; | |
| 855 | - j = i + n; | |
| 856 | - while( j>i ){ | |
| 857 | - z[j--] = z[i]; | |
| 858 | - if( z[i]=='\n' ){ | |
| 859 | - z[j--] = '\r'; | |
| 860 | - } | |
| 861 | - i--; | |
| 862 | - } | |
| 863 | - p->nUsed += n; | |
| 864 | - p->aData[p->nUsed] = 0; | |
| 865 | -} | |
| 857 | + p->nUsed = j; | |
| 858 | + z[j] = 0; | |
| 859 | + while( j>i ){ | |
| 860 | + if( (z[--j] = z[--i]) =='\n' ){ | |
| 861 | + z[--j] = '\r'; | |
| 862 | + } | |
| 863 | + } | |
| 864 | +} | |
| 865 | +#endif | |
| 866 | 866 | |
| 867 | 867 | /* |
| 868 | 868 | ** Remove every \r character from the given blob. |
| 869 | 869 | */ |
| 870 | 870 | void blob_remove_cr(Blob *p){ |
| 871 | 871 |
| --- src/blob.c | |
| +++ src/blob.c | |
| @@ -836,35 +836,35 @@ | |
| 836 | blob_reset(&b3); |
| 837 | } |
| 838 | printf("ok\n"); |
| 839 | } |
| 840 | |
| 841 | /* |
| 842 | ** Convert every \n character in the given blob into \r\n. |
| 843 | */ |
| 844 | void blob_add_cr(Blob *p){ |
| 845 | int i, j, n; |
| 846 | char *z = p->aData; |
| 847 | for(i=n=0; i<p->nUsed; i++){ |
| 848 | if( z[i]=='\n' ) n++; |
| 849 | } |
| 850 | if( p->nUsed+n+1>p->nAlloc ){ |
| 851 | blob_resize(p, p->nUsed+n); |
| 852 | z = p->aData; |
| 853 | } |
| 854 | i = p->nUsed - 1; |
| 855 | j = i + n; |
| 856 | while( j>i ){ |
| 857 | z[j--] = z[i]; |
| 858 | if( z[i]=='\n' ){ |
| 859 | z[j--] = '\r'; |
| 860 | } |
| 861 | i--; |
| 862 | } |
| 863 | p->nUsed += n; |
| 864 | p->aData[p->nUsed] = 0; |
| 865 | } |
| 866 | |
| 867 | /* |
| 868 | ** Remove every \r character from the given blob. |
| 869 | */ |
| 870 | void blob_remove_cr(Blob *p){ |
| 871 |
| --- src/blob.c | |
| +++ src/blob.c | |
| @@ -836,35 +836,35 @@ | |
| 836 | blob_reset(&b3); |
| 837 | } |
| 838 | printf("ok\n"); |
| 839 | } |
| 840 | |
| 841 | #ifdef __MINGW32__ |
| 842 | /* |
| 843 | ** Convert every \n character in the given blob into \r\n. |
| 844 | */ |
| 845 | void blob_add_cr(Blob *p){ |
| 846 | char *z = p->aData; |
| 847 | int j = p->nUsed; |
| 848 | int i, n; |
| 849 | for(i=n=0; i<j; i++){ |
| 850 | if( z[i]=='\n' ) n++; |
| 851 | } |
| 852 | j += n; |
| 853 | if( j>=p->nAlloc ){ |
| 854 | blob_resize(p, j); |
| 855 | z = p->aData; |
| 856 | } |
| 857 | p->nUsed = j; |
| 858 | z[j] = 0; |
| 859 | while( j>i ){ |
| 860 | if( (z[--j] = z[--i]) =='\n' ){ |
| 861 | z[--j] = '\r'; |
| 862 | } |
| 863 | } |
| 864 | } |
| 865 | #endif |
| 866 | |
| 867 | /* |
| 868 | ** Remove every \r character from the given blob. |
| 869 | */ |
| 870 | void blob_remove_cr(Blob *p){ |
| 871 |