Fossil SCM
Fix a serious memory leak in the "read" logic of the Fuse Filesystem.
Commit
7a7ef00b3500bb9b666addb9581322756be40d83
Parent
bd4565e9d0b0672…
1 file changed
+7
+7
| --- src/fusefs.c | ||
| +++ src/fusefs.c | ||
| @@ -245,10 +245,11 @@ | ||
| 245 | 245 | blob_reset(&fusefs.content); |
| 246 | 246 | } |
| 247 | 247 | fusefs.pFile = manifest_file_seek(fusefs.pMan, fusefs.az[2], 0); |
| 248 | 248 | if( fusefs.pFile==0 ) return -ENOENT; |
| 249 | 249 | rid = uuid_to_rid(fusefs.pFile->zUuid, 0); |
| 250 | + blob_reset(&fusefs.content); | |
| 250 | 251 | content_get(rid, &fusefs.content); |
| 251 | 252 | if( offset>blob_size(&fusefs.content) ) return 0; |
| 252 | 253 | if( offset+size>blob_size(&fusefs.content) ){ |
| 253 | 254 | size = blob_size(&fusefs.content) - offset; |
| 254 | 255 | } |
| @@ -296,11 +297,13 @@ | ||
| 296 | 297 | #ifndef FOSSIL_HAVE_FUSEFS |
| 297 | 298 | fossil_fatal("this build of fossil does not support the fuse filesystem"); |
| 298 | 299 | #else |
| 299 | 300 | char *zMountPoint; |
| 300 | 301 | char *azNewArgv[5]; |
| 302 | + int i; | |
| 301 | 303 | int doDebug = find_option("debug","d",0)!=0; |
| 304 | + | |
| 302 | 305 | db_find_and_open_repository(0,0); |
| 303 | 306 | verify_all_options(); |
| 304 | 307 | blob_init(&fusefs.content, 0, 0); |
| 305 | 308 | if( g.argc!=3 ) usage("DIRECTORY"); |
| 306 | 309 | zMountPoint = g.argv[2]; |
| @@ -312,7 +315,11 @@ | ||
| 312 | 315 | azNewArgv[2] = "-s"; |
| 313 | 316 | azNewArgv[3] = zMountPoint; |
| 314 | 317 | azNewArgv[4] = 0; |
| 315 | 318 | g.localOpen = 0; /* Prevent tags like "current" and "prev" */ |
| 316 | 319 | fuse_main(4, azNewArgv, &fusefs_methods, NULL); |
| 320 | + manifest_destroy(fusefs.pMan); | |
| 321 | + blob_reset(&fusefs.content); | |
| 322 | + for(i=0; i<count(fusefs.az); i++) fossil_free(fusefs.az[i]); | |
| 323 | + memset(&fusefs, 0, sizeof(fusefs)); | |
| 317 | 324 | #endif |
| 318 | 325 | } |
| 319 | 326 |
| --- src/fusefs.c | |
| +++ src/fusefs.c | |
| @@ -245,10 +245,11 @@ | |
| 245 | blob_reset(&fusefs.content); |
| 246 | } |
| 247 | fusefs.pFile = manifest_file_seek(fusefs.pMan, fusefs.az[2], 0); |
| 248 | if( fusefs.pFile==0 ) return -ENOENT; |
| 249 | rid = uuid_to_rid(fusefs.pFile->zUuid, 0); |
| 250 | content_get(rid, &fusefs.content); |
| 251 | if( offset>blob_size(&fusefs.content) ) return 0; |
| 252 | if( offset+size>blob_size(&fusefs.content) ){ |
| 253 | size = blob_size(&fusefs.content) - offset; |
| 254 | } |
| @@ -296,11 +297,13 @@ | |
| 296 | #ifndef FOSSIL_HAVE_FUSEFS |
| 297 | fossil_fatal("this build of fossil does not support the fuse filesystem"); |
| 298 | #else |
| 299 | char *zMountPoint; |
| 300 | char *azNewArgv[5]; |
| 301 | int doDebug = find_option("debug","d",0)!=0; |
| 302 | db_find_and_open_repository(0,0); |
| 303 | verify_all_options(); |
| 304 | blob_init(&fusefs.content, 0, 0); |
| 305 | if( g.argc!=3 ) usage("DIRECTORY"); |
| 306 | zMountPoint = g.argv[2]; |
| @@ -312,7 +315,11 @@ | |
| 312 | azNewArgv[2] = "-s"; |
| 313 | azNewArgv[3] = zMountPoint; |
| 314 | azNewArgv[4] = 0; |
| 315 | g.localOpen = 0; /* Prevent tags like "current" and "prev" */ |
| 316 | fuse_main(4, azNewArgv, &fusefs_methods, NULL); |
| 317 | #endif |
| 318 | } |
| 319 |
| --- src/fusefs.c | |
| +++ src/fusefs.c | |
| @@ -245,10 +245,11 @@ | |
| 245 | blob_reset(&fusefs.content); |
| 246 | } |
| 247 | fusefs.pFile = manifest_file_seek(fusefs.pMan, fusefs.az[2], 0); |
| 248 | if( fusefs.pFile==0 ) return -ENOENT; |
| 249 | rid = uuid_to_rid(fusefs.pFile->zUuid, 0); |
| 250 | blob_reset(&fusefs.content); |
| 251 | content_get(rid, &fusefs.content); |
| 252 | if( offset>blob_size(&fusefs.content) ) return 0; |
| 253 | if( offset+size>blob_size(&fusefs.content) ){ |
| 254 | size = blob_size(&fusefs.content) - offset; |
| 255 | } |
| @@ -296,11 +297,13 @@ | |
| 297 | #ifndef FOSSIL_HAVE_FUSEFS |
| 298 | fossil_fatal("this build of fossil does not support the fuse filesystem"); |
| 299 | #else |
| 300 | char *zMountPoint; |
| 301 | char *azNewArgv[5]; |
| 302 | int i; |
| 303 | int doDebug = find_option("debug","d",0)!=0; |
| 304 | |
| 305 | db_find_and_open_repository(0,0); |
| 306 | verify_all_options(); |
| 307 | blob_init(&fusefs.content, 0, 0); |
| 308 | if( g.argc!=3 ) usage("DIRECTORY"); |
| 309 | zMountPoint = g.argv[2]; |
| @@ -312,7 +315,11 @@ | |
| 315 | azNewArgv[2] = "-s"; |
| 316 | azNewArgv[3] = zMountPoint; |
| 317 | azNewArgv[4] = 0; |
| 318 | g.localOpen = 0; /* Prevent tags like "current" and "prev" */ |
| 319 | fuse_main(4, azNewArgv, &fusefs_methods, NULL); |
| 320 | manifest_destroy(fusefs.pMan); |
| 321 | blob_reset(&fusefs.content); |
| 322 | for(i=0; i<count(fusefs.az); i++) fossil_free(fusefs.az[i]); |
| 323 | memset(&fusefs, 0, sizeof(fusefs)); |
| 324 | #endif |
| 325 | } |
| 326 |