 39097daf15
			
		
	
	
		39097daf15
		
	
	
	
	
		
			
			Hosts hold on to handles provided by guest-file-open for periods that can span beyond the life of the qemu-ga process that issued them. Since these are issued starting from 0 on every restart, we run the risk of issuing duplicate handles after restarts/reboots. As a result, users with a stale copy of these handles may end up reading/writing corrupted data due to their existing handles effectively being re-assigned to an unexpected file or offset. We unfortunately do not issue handles as strings, but as integers, so a solution such as using UUIDs can't be implemented without introducing a new interface. As a workaround, we fix this by implementing a persistent key-value store that will be used to track the value of the last handle that was issued across restarts/reboots to avoid issuing duplicates. The store is automatically written to the same directory we currently set via --statedir to track fsfreeze state, and so should be applicable for stable releases where this flag is supported. A follow-up can use this same store for handling fsfreeze state, but that change is cosmetic and left out for now. Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com> Cc: qemu-stable@nongnu.org * fixed guest_file_handle_add() return value from uint64_t to int64_t
		
			
				
	
	
		
			43 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * QEMU Guest Agent core declarations
 | |
|  *
 | |
|  * Copyright IBM Corp. 2011
 | |
|  *
 | |
|  * Authors:
 | |
|  *  Adam Litke        <aglitke@linux.vnet.ibm.com>
 | |
|  *  Michael Roth      <mdroth@linux.vnet.ibm.com>
 | |
|  *
 | |
|  * This work is licensed under the terms of the GNU GPL, version 2 or later.
 | |
|  * See the COPYING file in the top-level directory.
 | |
|  */
 | |
| #include "qapi/qmp/dispatch.h"
 | |
| #include "qemu-common.h"
 | |
| 
 | |
| #define QGA_READ_COUNT_DEFAULT 4096
 | |
| 
 | |
| typedef struct GAState GAState;
 | |
| typedef struct GACommandState GACommandState;
 | |
| extern GAState *ga_state;
 | |
| 
 | |
| void ga_command_state_init(GAState *s, GACommandState *cs);
 | |
| void ga_command_state_add(GACommandState *cs,
 | |
|                           void (*init)(void),
 | |
|                           void (*cleanup)(void));
 | |
| void ga_command_state_init_all(GACommandState *cs);
 | |
| void ga_command_state_cleanup_all(GACommandState *cs);
 | |
| GACommandState *ga_command_state_new(void);
 | |
| bool ga_logging_enabled(GAState *s);
 | |
| void ga_disable_logging(GAState *s);
 | |
| void ga_enable_logging(GAState *s);
 | |
| void slog(const gchar *fmt, ...);
 | |
| void ga_set_response_delimited(GAState *s);
 | |
| bool ga_is_frozen(GAState *s);
 | |
| void ga_set_frozen(GAState *s);
 | |
| void ga_unset_frozen(GAState *s);
 | |
| const char *ga_fsfreeze_hook(GAState *s);
 | |
| int64_t ga_get_fd_handle(GAState *s, Error **errp);
 | |
| 
 | |
| #ifndef _WIN32
 | |
| void reopen_fd_to_null(int fd);
 | |
| #endif
 |