|
@@ -415,6 +415,8 @@ static int slam_pull_value ( struct slam_request *slam,
|
415
|
415
|
static int slam_pull_header ( struct slam_request *slam,
|
416
|
416
|
struct io_buffer *iobuf ) {
|
417
|
417
|
void *header = iobuf->data;
|
|
418
|
+ unsigned long total_bytes;
|
|
419
|
+ unsigned long block_size;
|
418
|
420
|
int rc;
|
419
|
421
|
|
420
|
422
|
/* If header matches cached header, just pull it and return */
|
|
@@ -431,22 +433,26 @@ static int slam_pull_header ( struct slam_request *slam,
|
431
|
433
|
*/
|
432
|
434
|
if ( ( rc = slam_pull_value ( slam, iobuf, NULL ) ) != 0 )
|
433
|
435
|
return rc;
|
434
|
|
- if ( ( rc = slam_pull_value ( slam, iobuf,
|
435
|
|
- &slam->total_bytes ) ) != 0 )
|
|
436
|
+ if ( ( rc = slam_pull_value ( slam, iobuf, &total_bytes ) ) != 0 )
|
436
|
437
|
return rc;
|
437
|
|
- if ( ( rc = slam_pull_value ( slam, iobuf,
|
438
|
|
- &slam->block_size ) ) != 0 )
|
|
438
|
+ if ( ( rc = slam_pull_value ( slam, iobuf, &block_size ) ) != 0 )
|
439
|
439
|
return rc;
|
440
|
440
|
|
|
441
|
+ /* Sanity check */
|
|
442
|
+ if ( block_size == 0 ) {
|
|
443
|
+ DBGC ( slam, "SLAM %p ignoring zero block size\n", slam );
|
|
444
|
+ return -EINVAL;
|
|
445
|
+ }
|
|
446
|
+
|
441
|
447
|
/* Update the cached header */
|
442
|
448
|
slam->header_len = ( iobuf->data - header );
|
443
|
449
|
assert ( slam->header_len <= sizeof ( slam->header ) );
|
444
|
450
|
memcpy ( slam->header, header, slam->header_len );
|
445
|
451
|
|
446
|
452
|
/* Calculate number of blocks */
|
447
|
|
- slam->num_blocks = ( ( slam->total_bytes + slam->block_size - 1 ) /
|
448
|
|
- slam->block_size );
|
449
|
|
-
|
|
453
|
+ slam->total_bytes = total_bytes;
|
|
454
|
+ slam->block_size = block_size;
|
|
455
|
+ slam->num_blocks = ( ( total_bytes + block_size - 1 ) / block_size );
|
450
|
456
|
DBGC ( slam, "SLAM %p has total bytes %ld, block size %ld, num "
|
451
|
457
|
"blocks %ld\n", slam, slam->total_bytes, slam->block_size,
|
452
|
458
|
slam->num_blocks );
|