Project

General

Profile

Enhancement #750 » 0019-sanitize-ftell-fseek-and-logfile-len-logstore-file_o.patch

Loïc Gomez, 2022-01-10 19:28

View differences:

src/log.c
190 190
static void log_reset(logstore_t *store)
191 191
{
192 192
	logfile_t *olf;
193
	long ftell_r;
193 194

  
194 195
	store->skip_advance = 0;
195 196

  
......
205 206
		list_remove_first(&store->file_group);
206 207
	}
207 208

  
208
	assert(olf);
209
	assert(olf->file);
209
	if (!olf || !olf->file)
210
		return;
210 211

  
211 212
	list_it_init_last(&store->file_group, &store->file_it);
212 213

  
213
	fseek(olf->file, 0, SEEK_END);
214
	olf->len = ftell(olf->file);
215
	store->file_offset = olf->len;
214
	fseek(olf->file, (long)0, SEEK_END);
215
	ftell_r = ftell(olf->file);
216
	if (ftell_r < 0) {
217
		mylog(LOG_ERROR, "log_reset: ftell error %s", strerror(errno));
218
		return;
219
	}
220
	store->file_offset = ftell_r;
221
	olf->len = (size_t)ftell_r;
216 222
}
217 223

  
218 224
void log_reinit(logstore_t *store)
......
266 272
	char *uniq_fname;
267 273
	char *canonical_fname = NULL;
268 274
	logfile_t *lf = NULL;
275
	long ftell_r;
269 276

  
270 277
	if (logdata->log_to_file) {
271 278
		if (log_has_file(logdata, filename)) {
......
295 302

  
296 303
		lf = bip_malloc(sizeof(logfile_t));
297 304
		lf->file = f;
298
		lf->len = ftell(f);
305
		ftell_r = ftell(f);
306
		lf->len = (size_t)ftell_r;
307
		if (ftell_r < 0) {
308
			mylog(LOG_ERROR, "log_add_file: ftell error %s",
309
					strerror(errno));
310
			free(uniq_fname);
311
			free(canonical_fname);
312
			fclose(f);
313
			return 0;
314
		}
299 315
		lf->filename = uniq_fname;
300 316
		lf->canonical_filename = canonical_fname;
301 317
		log_updatelast(lf);
......
307 323
		list_init(&store->file_group, NULL);
308 324
		store->name = bip_strdup(destination);
309 325
		store->skip_advance = 0;
326
		// should be safe to cast as lf->len comes from ftell()
310 327
		if (lf)
311
			store->file_offset = lf->len;
328
			store->file_offset = (long)lf->len;
312 329
		hash_insert(&logdata->logfgs, destination, store);
313 330
	}
314 331

  
......
827 844
	if (lf != list_get_last(&store->file_group))
828 845
		return 1;
829 846

  
830
	return store->file_offset != lf->len;
847
	// should be safe to cast to unsigned as we check ftell
848
	// when setting file_offset and only ++ since then
849
	return (size_t)store->file_offset != lf->len;
831 850
}
832 851

  
833 852
/*
src/log.h
47 47
	int memc;
48 48
	int track_backlog;
49 49
	list_iterator_t file_it;
50
	size_t file_offset;
50
	long file_offset;
51 51
} logstore_t;
52 52

  
53 53
typedef struct log
54
- 
(18-18/24)