qemu-io: Fix multiwrite_f error handling
Without this fix, some qiovs can be leaked if an error occurs. Also a semicolon at the end of the command line would make the code walk beyond the end of argv. Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
		
							parent
							
								
									f2360620fb
								
							
						
					
					
						commit
						67403dbba7
					
				@ -960,21 +960,21 @@ static int multiwrite_f(int argc, char **argv)
 | 
				
			|||||||
    buf = g_malloc0(nr_reqs * sizeof(*buf));
 | 
					    buf = g_malloc0(nr_reqs * sizeof(*buf));
 | 
				
			||||||
    qiovs = g_malloc(nr_reqs * sizeof(*qiovs));
 | 
					    qiovs = g_malloc(nr_reqs * sizeof(*qiovs));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (i = 0; i < nr_reqs; i++) {
 | 
					    for (i = 0; i < nr_reqs && optind < argc; i++) {
 | 
				
			||||||
        int j;
 | 
					        int j;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* Read the offset of the request */
 | 
					        /* Read the offset of the request */
 | 
				
			||||||
        offset = cvtnum(argv[optind]);
 | 
					        offset = cvtnum(argv[optind]);
 | 
				
			||||||
        if (offset < 0) {
 | 
					        if (offset < 0) {
 | 
				
			||||||
            printf("non-numeric offset argument -- %s\n", argv[optind]);
 | 
					            printf("non-numeric offset argument -- %s\n", argv[optind]);
 | 
				
			||||||
            return 0;
 | 
					            goto out;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        optind++;
 | 
					        optind++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (offset & 0x1ff) {
 | 
					        if (offset & 0x1ff) {
 | 
				
			||||||
            printf("offset %lld is not sector aligned\n",
 | 
					            printf("offset %lld is not sector aligned\n",
 | 
				
			||||||
                   (long long)offset);
 | 
					                   (long long)offset);
 | 
				
			||||||
            return 0;
 | 
					            goto out;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (i == 0) {
 | 
					        if (i == 0) {
 | 
				
			||||||
@ -1005,6 +1005,9 @@ static int multiwrite_f(int argc, char **argv)
 | 
				
			|||||||
        pattern++;
 | 
					        pattern++;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* If there were empty requests at the end, ignore them */
 | 
				
			||||||
 | 
					    nr_reqs = i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    gettimeofday(&t1, NULL);
 | 
					    gettimeofday(&t1, NULL);
 | 
				
			||||||
    cnt = do_aio_multiwrite(reqs, nr_reqs, &total);
 | 
					    cnt = do_aio_multiwrite(reqs, nr_reqs, &total);
 | 
				
			||||||
    gettimeofday(&t2, NULL);
 | 
					    gettimeofday(&t2, NULL);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user