@@ -72,7 +72,7 @@ static void
72
72
insert_datum (DATUM * info , char * av )
73
73
{
74
74
LIST * tokens , * ptr ;
75
- int fsize ;
75
+ unsigned int fsize ;
76
76
77
77
ASSERT (info != 0 );
78
78
ASSERT (av != 0 );
@@ -199,7 +199,7 @@ HANDLER (add_file)
199
199
{
200
200
char * av [6 ];
201
201
DATUM * info ;
202
- int fsize ;
202
+ unsigned int fsize ;
203
203
204
204
(void ) tag ;
205
205
(void ) len ;
@@ -229,10 +229,12 @@ HANDLER (add_file)
229
229
}
230
230
231
231
/* ensure we have a valid byte count */
232
- fsize = atoi (av [2 ]);
233
- if (fsize < 1 )
232
+ fsize = strtoul (av [2 ],0 ,10 );
233
+ /* check for overflow */
234
+ if (con -> user -> libsize + fsize < con -> user -> libsize )
234
235
{
235
- send_cmd (con , MSG_SERVER_NOSUCH , "invalid file size" );
236
+ log ("add_file(): %u byte file would overflow %s's library size" ,
237
+ fsize , con -> user -> nick );
236
238
return ;
237
239
}
238
240
@@ -273,6 +275,7 @@ HANDLER (share_file)
273
275
char * av [4 ];
274
276
DATUM * info ;
275
277
int i , type ;
278
+ unsigned int fsize ;
276
279
277
280
(void ) len ;
278
281
(void ) tag ;
@@ -327,10 +330,18 @@ HANDLER (share_file)
327
330
return ;
328
331
}
329
332
333
+ fsize = strtoul (av [1 ], 0 , 10 );
334
+ if (fsize + con -> user -> libsize < con -> user -> libsize )
335
+ {
336
+ log ("share_file(): %u byte file would overflow %s's library size" ,
337
+ fsize , con -> user -> nick );
338
+ return ;
339
+ }
340
+
330
341
if (!(info = new_datum (av [0 ], av [2 ])))
331
342
return ;
332
343
info -> user = con -> user ;
333
- info -> size = atoi ( av [ 1 ]) ;
344
+ info -> size = fsize ;
334
345
info -> type = type ;
335
346
336
347
insert_datum (info , av [0 ]);
@@ -342,7 +353,8 @@ HANDLER (user_sharing)
342
353
{
343
354
char * av [3 ];
344
355
USER * user ;
345
- int deltanum , deltasize ;
356
+ int shared ;
357
+ unsigned int libsize ;
346
358
347
359
(void ) len ;
348
360
ASSERT (validate_connection (con ));
@@ -358,13 +370,34 @@ HANDLER (user_sharing)
358
370
log ("user_sharing(): no such user %s (from %s)" , av [0 ], con -> host );
359
371
return ;
360
372
}
361
- deltanum = atoi (av [1 ]) - user -> shared ;
362
- Num_Files += deltanum ;
363
- user -> shared += deltanum ;
364
- deltasize = atoi (av [2 ]) - user -> libsize ;
365
- Num_Gigs += deltasize ;
366
- user -> libsize += deltasize ;
367
- pass_message_args (con , tag , "%s %d %d" , user -> nick , user -> shared ,
373
+
374
+ shared = atoi (av [1 ]);
375
+
376
+ if (shared < 0 )
377
+ {
378
+ log ("user_sharing(): negative count for %s from %s" , av [0 ], con -> host );
379
+ Num_Files -= user -> shared ;
380
+ Num_Gigs -= user -> libsize ;
381
+ user -> shared = 0 ;
382
+ user -> libsize = 0 ;
383
+ }
384
+ else
385
+ {
386
+ if (shared > user -> shared )
387
+ Num_Files += shared - user -> shared ;
388
+ else
389
+ Num_Files -= user -> shared - shared ;
390
+ user -> shared = shared ;
391
+
392
+ libsize = strtoul (av [2 ],0 ,10 );
393
+ if (libsize > user -> libsize )
394
+ Num_Gigs += libsize - user -> libsize ;
395
+ else
396
+ Num_Gigs -= user -> libsize - libsize ;
397
+ user -> libsize = libsize ;
398
+ }
399
+
400
+ pass_message_args (con , tag , "%s %hu %u" , user -> nick , user -> shared ,
368
401
user -> libsize );
369
402
}
370
403
@@ -374,7 +407,7 @@ HANDLER (add_directory)
374
407
{
375
408
char * dir , * basename , * md5 , * size , * bitrate , * freq , * duration ;
376
409
char path [_POSIX_PATH_MAX ], dirbuf [_POSIX_PATH_MAX ];
377
- int pathlen ;
410
+ int pathlen , fsize ;
378
411
DATUM * info ;
379
412
380
413
(void ) tag ;
@@ -457,11 +490,18 @@ HANDLER (add_directory)
457
490
continue ; /* get next file */
458
491
}
459
492
493
+ fsize = atoi (size );
494
+ if (fsize < 1 )
495
+ {
496
+ send_cmd (con ,MSG_SERVER_NOSUCH ,"invalid size" );
497
+ continue ;
498
+ }
499
+
460
500
/* create the db record for this file */
461
501
if (!(info = new_datum (path , md5 )))
462
502
return ;
463
503
info -> user = con -> user ;
464
- info -> size = atoi ( size ) ;
504
+ info -> size = fsize ;
465
505
info -> bitrate = bitrateToMask (atoi (bitrate ), con -> user );
466
506
info -> frequency = freqToMask (atoi (freq ), con -> user );
467
507
info -> duration = atoi (duration );
0 commit comments