Fossil SCM

Prevent buffer overrun when adding \r characters to the check-in descriptions for win32. Ticket [41bb23e650].

drh 2008-10-26 02:29 trunk
Commit e44d7a4b5af0b66bf493ae55f0c8b71dc6ad46ed
1 file changed +16 -16
+16 -16
--- src/blob.c
+++ src/blob.c
@@ -836,35 +836,35 @@
836836
blob_reset(&b3);
837837
}
838838
printf("ok\n");
839839
}
840840
841
+#ifdef __MINGW32__
841842
/*
842843
** Convert every \n character in the given blob into \r\n.
843844
*/
844845
void blob_add_cr(Blob *p){
845
- int i, j, n;
846846
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++){
848850
if( z[i]=='\n' ) n++;
849851
}
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);
852855
z = p->aData;
853856
}
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
866866
867867
/*
868868
** Remove every \r character from the given blob.
869869
*/
870870
void blob_remove_cr(Blob *p){
871871
--- 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

Keyboard Shortcuts

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