Fossil

Changes On Branch clientSyncLeakFix
Login

Changes On Branch clientSyncLeakFix

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Changes In Branch clientSyncLeakFix Excluding Merge-Ins

This is equivalent to a diff from 0b61e3c0 to 7611406f

2012-01-24
13:28
Fix several blob leaks that can lead to out of memory conditions for very large push operations. Revise the order of error messages so that simple HTTP timeout produces a better diagnostic. The HTTP trace files need to be opened in binary mode. ... (check-in: 1e398088 user: mistachkin tags: trunk)
2012-01-22
06:52
Make sure that autosetup ends up defining FOSSIL_ENABLE_TCL in the Makefile when necessary. ... (check-in: 21555be3 user: mistachkin tags: trunk)
2012-01-20
17:32
The HTTP trace files need to be opened in binary mode. ... (Closed-Leaf check-in: 7611406f user: mistachkin tags: clientSyncLeakFix)
17:16
Revise the order of error messages so that simple HTTP timeout produces a better diagnostic. ... (check-in: dd71069b user: mistachkin tags: clientSyncLeakFix)
15:22
Fix several blob leaks that can lead to out of memory conditions for very large push operations. ... (check-in: 81c685e0 user: mistachkin tags: clientSyncLeakFix)
2012-01-18
13:22
Merge trunk changes into the retro-sbsdiff branch. ... (check-in: 6daee94f user: drh tags: retro-sbsdiff)
13:21
Add the ability to run TH1 scripts before and after each xfer request. ... (check-in: 0b61e3c0 user: drh tags: trunk)
12:56
Add xfersetup to the makemake.tcl script. ... (Closed-Leaf check-in: 9441f6fb user: mistachkin tags: pushScript)
12:47
Correct casing typos. ... (check-in: 0c042ce7 user: mistachkin tags: trunk)

Changes to src/http.c.

172
173
174
175
176
177
178
179

180
181
182
183
184
185
186
187

188
189
190
191
192
193
194
172
173
174
175
176
177
178

179
180
181
182
183
184
185
186

187
188
189
190
191
192
193
194







-
+







-
+







  */
  if( g.fHttpTrace ){
    static int traceCnt = 0;
    char *zOutFile;
    FILE *out;
    traceCnt++;
    zOutFile = mprintf("http-request-%d.txt", traceCnt);
    out = fopen(zOutFile, "w");
    out = fopen(zOutFile, "wb");
    if( out ){
      fwrite(blob_buffer(&hdr), 1, blob_size(&hdr), out);
      fwrite(blob_buffer(&payload), 1, blob_size(&payload), out);
      fclose(out);
    }
    free(zOutFile);
    zOutFile = mprintf("http-reply-%d.txt", traceCnt);
    out = fopen(zOutFile, "w");
    out = fopen(zOutFile, "wb");
    transport_log(out);
    free(zOutFile);
  }

  /*
  ** Send the request to the server.
  */
251
252
253
254
255
256
257




258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269




270
271
272
273
274
275
276







+
+
+
+








-
-
-
-







                          "application/x-fossil-uncompressed", -1)==0 ){
        isCompressed = 0;
      }else if( fossil_strnicmp(&zLine[14], "application/x-fossil", -1)!=0 ){
        isError = 1;
      }
    }
  }
  if( iLength<0 ){
    fossil_fatal("server did not reply");
    goto write_err;
  }
  if( rc!=200 ){
    fossil_warning("\"location:\" missing from 302 redirect reply");
    goto write_err;
  }

  /*
  ** Extract the reply payload that follows the header
  */
  if( iLength<0 ){
    fossil_fatal("server did not reply");
    goto write_err;
  }
  blob_zero(pReply);
  blob_resize(pReply, iLength);
  iLength = transport_receive(blob_buffer(pReply), iLength);
  blob_resize(pReply, iLength);
  if( isError ){
    char *z;
    int i, j;

Changes to src/xfer.c.

125
126
127
128
129
130
131

132
133
134
135

136
137
138
139
140
141
142
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144







+




+







    return;
  }
  blob_zero(&content);
  blob_zero(&hash);
  blob_extract(pXfer->pIn, n, &content);
  if( !cloneFlag && uuid_is_shunned(blob_str(&pXfer->aToken[1])) ){
    /* Ignore files that have been shunned */
    blob_reset(&content);
    return;
  }
  if( isPriv && !g.perm.Private ){
    /* Do not accept private files if not authorized */
    blob_reset(&content);
    return;
  }
  if( cloneFlag ){
    if( pXfer->nToken==4 ){
      srcid = rid_from_uuid(&pXfer->aToken[2], 1, isPriv);
      pXfer->nDeltaRcvd++;
    }else{
154
155
156
157
158
159
160


161
162
163
164
165
166
167
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171







+
+







    srcid = rid_from_uuid(&pXfer->aToken[2], 1, isPriv);
    if( content_get(srcid, &src)==0 ){
      rid = content_put_ex(&content, blob_str(&pXfer->aToken[1]), srcid,
                           0, isPriv);
      pXfer->nDanglingFile++;
      db_multi_exec("DELETE FROM phantom WHERE rid=%d", rid);
      if( !isPriv ) content_make_public(rid);
      blob_reset(&src);
      blob_reset(&content);
      return;
    }
    pXfer->nDeltaRcvd++;
    blob_delta_apply(&src, &content, &next);
    blob_reset(&src);
    blob_reset(&content);
    content = next;
233
234
235
236
237
238
239

240
241
242
243
244
245
246
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251







+







    /* Do not accept private files if not authorized */
    return;
  }
  blob_zero(&content);
  blob_extract(pXfer->pIn, szC, &content);
  if( uuid_is_shunned(blob_str(&pXfer->aToken[1])) ){
    /* Ignore files that have been shunned */
    blob_reset(&content);
    return;
  }
  if( pXfer->nToken==5 ){
    srcid = rid_from_uuid(&pXfer->aToken[2], 1, isPriv);
    pXfer->nDeltaRcvd++;
  }else{
    srcid = 0;
418
419
420
421
422
423
424

425
426
427
428
429
430
431
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437







+







      if( isPriv ) blob_append(pXfer->pOut, "private\n", -1);
      blob_appendf(pXfer->pOut, "file %b %d\n", pUuid, size);
      blob_append(pXfer->pOut, blob_buffer(&content), size);
      pXfer->nFileSent++;
    }else{
      pXfer->nDeltaSent++;
    }
    blob_reset(&content);
  }
  remote_has(rid);
  blob_reset(&uuid);
#if 0
  if( blob_buffer(pXfer->pOut)[blob_size(pXfer->pOut)-1]!='\n' ){
    blob_appendf(pXfer->pOut, "\n", 1);
  }