You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							556 lines
						
					
					
						
							16 KiB
						
					
					
				
			
		
		
	
	
							556 lines
						
					
					
						
							16 KiB
						
					
					
				| # --- SDE-COPYRIGHT-NOTE-BEGIN --- | |
| # This copyright note is auto-generated by ./scripts/Create-CopyPatch. | |
| # | |
| # Filename: package/.../open-iscsi/open-iscsi-2.0.873-upstream-fixes.patch | |
| # Copyright (C) 2013 The OpenSDE Project | |
| # | |
| # More information can be found in the files COPYING and README. | |
| # | |
| # This patch file is dual-licensed. It is available under the license the | |
| # patched project is licensed under, as long as it is an OpenSource license | |
| # as defined at http://www.opensource.org/ (e.g. BSD, X11) or under the terms | |
| # of the GNU General Public License as published by the Free Software | |
| # Foundation; either version 2 of the License, or (at your option) any later | |
| # version. | |
| # --- SDE-COPYRIGHT-NOTE-END --- | |
|  | |
| From 71cd021b74a7094b5186a42bfe59a35e2fa66018 Mon Sep 17 00:00:00 2001 | |
| From: Mike Christie <[email protected]> | |
| Date: Wed, 5 Sep 2012 16:18:16 -0500 | |
| Subject: [PATCH] iscsid: fix iscsid segfault during qla4xxx login | |
|  | |
| If the kernel sends multiple ISCSI_KEVENT_CONN_LOGIN_STATE | |
| events for the same login event iscsid will segault. | |
|  | |
| When we get a conn error we will set the r_stage to reopen, then when | |
| session_conn_process_login handles the first login event we set the r_stage | |
| to R_STAGE_NO_CHANGE. But then it looks like if we get a second login event | |
| r_stage is no_change and session_conn_process_login will run again and | |
| call mgmt_ipc_write_rsp on a bad qtask. | |
| --- | |
|  usr/initiator.c |    5 ++++- | |
|  1 files changed, 4 insertions(+), 1 deletions(-) | |
|  | |
| diff --git a/usr/initiator.c b/usr/initiator.c | |
| index 79ca32c..d475358 100644 | |
| --- a/usr/initiator.c | |
| +++ b/usr/initiator.c | |
| @@ -993,7 +993,7 @@ static void session_scan_host(struct iscsi_session *session, int hostno, | |
|  		exit(0); | |
|  	} else if (pid > 0) { | |
|  		reap_inc(); | |
| -		if (qtask) { | |
| +		if (qtask && qtask->mgmt_ipc_fd >= 0) { | |
|  			close(qtask->mgmt_ipc_fd); | |
|  			free(qtask); | |
|  		} | |
| @@ -1618,6 +1618,9 @@ static void session_conn_process_login(void *data) | |
|  	if (state == ISCSI_CONN_STATE_FREE) | |
|  		goto failed_login; | |
|   | |
| +	if (conn->state == ISCSI_CONN_STATE_LOGGED_IN) | |
| +		return; | |
| + | |
|  	conn->state = ISCSI_CONN_STATE_LOGGED_IN; | |
|  	/* | |
|  	 * ok we were in_login and now we got the notification that we are | |
| --  | |
| 1.7.2.3 | |
|  | |
|  | |
| From f0a8c95426d21413d9980d31740e193208e3280e Mon Sep 17 00:00:00 2001 | |
| From: Eddie Wai <[email protected]> | |
| Date: Wed, 5 Sep 2012 14:14:20 -0700 | |
| Subject: [PATCH] ISCSISTART: Bring up the corresponding network interface for iboot | |
|  | |
| This is needed for the iSCSI offload boot. | |
|  | |
| Snip from M. Christie: | |
| Note that we must bring up the interface before iface_setup_from_boot_context, | |
| because we will want iscsi_sysfs_get_host_no_from_hwaddress to be able to match | |
| a MAC to a iscsi host.  For some bnx2i cards, the card has to be ifupd for the | |
| iscsi interface to have a MAC. If it is not ifupd we have seen MACs with all | |
| zeros or no iscsi_hosts on different cards. | |
|  | |
| Signed-off-by: Eddie Wai <[email protected]> | |
| --- | |
|  usr/iface.c |    4 ++++ | |
|  1 files changed, 4 insertions(+), 0 deletions(-) | |
|  | |
| diff --git a/usr/iface.c b/usr/iface.c | |
| index 3a9582e..4028e34 100644 | |
| --- a/usr/iface.c | |
| +++ b/usr/iface.c | |
| @@ -917,6 +917,10 @@ int iface_setup_from_boot_context(struct iface_rec *iface, | |
|  							transport_name)) | |
|  			t = iscsi_sysfs_get_transport_by_name(transport_name); | |
|   | |
| +		if (net_ifup_netdev(context->iface)) | |
| +			log_warning("Could not bring up netdev %s for boot", | |
| +				    context->iface); | |
| + | |
|  		hostno = iscsi_sysfs_get_host_no_from_hwaddress(context->mac, | |
|  								&rc); | |
|  		if (rc) { | |
| --  | |
| 1.7.2.3 | |
|  | |
|  | |
| From d81fd4903cebb1d00aa48b0718d20e34b00dfde1 Mon Sep 17 00:00:00 2001 | |
| From: Mike Christie <[email protected]> | |
| Date: Wed, 26 Sep 2012 21:19:39 -0500 | |
| Subject: [PATCH] iscsi tools: fix compile error when OFFLOAD_BOOT_SUPPORT defined | |
|  | |
| Fix compile error when OFFLOAD_BOOT_SUPPORT is defined and fix | |
| warning when it is defined. | |
| --- | |
|  usr/iface.c |    3 ++- | |
|  1 files changed, 2 insertions(+), 1 deletions(-) | |
|  | |
| diff --git a/usr/iface.c b/usr/iface.c | |
| index 4028e34..4f81a76 100644 | |
| --- a/usr/iface.c | |
| +++ b/usr/iface.c | |
| @@ -894,7 +894,6 @@ int iface_setup_from_boot_context(struct iface_rec *iface, | |
|  				   struct boot_context *context) | |
|  { | |
|  	struct iscsi_transport *t = NULL; | |
| -	char transport_name[ISCSI_TRANSPORT_NAME_MAXLEN]; | |
|  	uint32_t hostno; | |
|   | |
|  	if (strlen(context->initiatorname)) | |
| @@ -910,6 +909,8 @@ int iface_setup_from_boot_context(struct iface_rec *iface, | |
|  	} else if (strlen(context->iface)) { | |
|  /* this ifdef is only temp until distros and firmwares are updated */ | |
|  #ifdef OFFLOAD_BOOT_SUPPORTED | |
| +		char transport_name[ISCSI_TRANSPORT_NAME_MAXLEN]; | |
| +		int rc; | |
|   | |
|  		memset(transport_name, 0, ISCSI_TRANSPORT_NAME_MAXLEN); | |
|  		/* make sure offload driver is loaded */ | |
| --  | |
| 1.7.2.3 | |
|  | |
|  | |
| From 13d08e79090421fbf67fd727aada487ea23ecc2d Mon Sep 17 00:00:00 2001 | |
| From: Eddie Wai <[email protected]> | |
| Date: Thu, 27 Sep 2012 13:57:12 -0700 | |
| Subject: [PATCH] ISCSID: Passing more net params from ibft to iface | |
|  | |
| Added the passing of the vlan_id, subnet_mask, and gateway attributes | |
| from the ibft context to the iface struct for the connection request. | |
|  | |
| Signed-off-by: Eddie Wai <[email protected]> | |
| --- | |
|  usr/iface.c |    5 +++++ | |
|  1 files changed, 5 insertions(+), 0 deletions(-) | |
|  | |
| diff --git a/usr/iface.c b/usr/iface.c | |
| index 4f81a76..c86892e 100644 | |
| --- a/usr/iface.c | |
| +++ b/usr/iface.c | |
| @@ -962,6 +962,11 @@ int iface_setup_from_boot_context(struct iface_rec *iface, | |
|  		sizeof(iface->hwaddress)); | |
|  	strlcpy(iface->ipaddress, context->ipaddr, | |
|  		sizeof(iface->ipaddress)); | |
| +	iface->vlan_id = atoi(context->vlan); | |
| +	strlcpy(iface->subnet_mask, context->mask, | |
| +		sizeof(iface->subnet_mask)); | |
| +	strlcpy(iface->gateway, context->gateway, | |
| +		sizeof(iface->gateway)); | |
|  	log_debug(1, "iface " iface_fmt "\n", iface_str(iface)); | |
|  	return 1; | |
|  } | |
| --  | |
| 1.7.2.3 | |
|  | |
|  | |
| From 9dd181dcb1ca299cd82075b8e598fc57d87ee1c0 Mon Sep 17 00:00:00 2001 | |
| From: Jim Ramsay <[email protected]> | |
| Date: Wed, 3 Oct 2012 09:57:43 -0400 | |
| Subject: [PATCH] iscsi tools: Convert '-r' argument to an integer before checking if it is a path | |
|  | |
| If there is a file in the CWD named '1' and you were trying to run | |
| 'iscsiadm -m session -r 1 ...', the command would fail with "1 is not a | |
| directory". | |
|  | |
| Root cause: The code that parses the -r option's argument tries lstat(2) | |
| first, falling back to atoi(3) only if lstat fails. | |
|  | |
| This change inverts the order of checks, first with strtol(3) to see if | |
| the argument given is a positive integer, then falling back to lstat(2) | |
| only if it is not. | |
|  | |
| Signed-off-by: Jim Ramsay <[email protected]> | |
| --- | |
|  usr/iscsi_sysfs.c |   17 +++++++++-------- | |
|  1 files changed, 9 insertions(+), 8 deletions(-) | |
|  | |
| diff --git a/usr/iscsi_sysfs.c b/usr/iscsi_sysfs.c | |
| index 123dde3..4015b35 100644 | |
| --- a/usr/iscsi_sysfs.c | |
| +++ b/usr/iscsi_sysfs.c | |
| @@ -740,7 +740,7 @@ int iscsi_sysfs_session_has_leadconn(uint32_t sid) | |
|   * /sys/devices/platform/hostH/sessionS/targetH:B:I | |
|   * /sys/devices/platform/hostH/sessionS | |
|   * | |
| - * return the sid S. If just the sid is passed in it will be covnerted | |
| + * return the sid S. If just the sid is passed in it will be converted | |
|   * to a int. | |
|   */ | |
|  int iscsi_sysfs_get_sid_from_path(char *session) | |
| @@ -748,15 +748,16 @@ int iscsi_sysfs_get_sid_from_path(char *session) | |
|  	struct sysfs_device *dev_parent, *dev; | |
|  	struct stat statb; | |
|  	char devpath[PATH_SIZE]; | |
| +	char *end; | |
| +	int sid; | |
| + | |
| +	sid = strtol(session, &end, 10); | |
| +	if (sid > 0 && *session != '\0' && *end == '\0') | |
| +		return sid; | |
|   | |
|  	if (lstat(session, &statb)) { | |
| -		log_debug(1, "Could not stat %s failed with %d", | |
| -			  session, errno); | |
| -		if (index(session, '/')) { | |
| -			log_error("%s is an invalid session path\n", session); | |
| -			exit(1); | |
| -		} | |
| -		return atoi(session); | |
| +		log_error("%s is an invalid session ID or path\n", session); | |
| +		exit(1); | |
|  	} | |
|   | |
|  	if (!S_ISDIR(statb.st_mode) && !S_ISLNK(statb.st_mode)) { | |
| --  | |
| 1.7.2.3 | |
|  | |
|  | |
| From 97db3db45c7e96888ea48a54ff19b7ff5d08cca6 Mon Sep 17 00:00:00 2001 | |
| From: Andy Grover <[email protected]> | |
| Date: Wed, 24 Oct 2012 15:37:28 -0700 | |
| Subject: [PATCH] Update README for removal of DBM requirement | |
|  | |
| Removed in 093b1f4 (2006) | |
|  | |
| Signed-off-by: Andy Grover <[email protected]> | |
| --- | |
|  README |   23 ++++++++++++++--------- | |
|  1 files changed, 14 insertions(+), 9 deletions(-) | |
|  | |
| diff --git a/README b/README | |
| index 7364b2d..ec22098 100644 | |
| --- a/README | |
| +++ b/README | |
| @@ -159,15 +159,20 @@ Usage: iscsid [OPTION] | |
|  5. Open-iSCSI Configuration Utility | |
|  =================================== | |
|   | |
| -Open-iSCSI persistent configuration is implemented as a DBM database | |
| -available on all Linux installations. | |
| - | |
| -The database contains two tables: | |
| - | |
| -- Discovery table (/etc/iscsi/send_targets); | |
| -- Node table (/etc/iscsi/nodes). | |
| - | |
| -The regular place for iSCSI database files: /etc/iscsi/nodes | |
| +Open-iSCSI persistent configuration is stored in a number of | |
| +directories under a configuration root directory, using a flat-file | |
| +format. This configuration root directory is /etc/iscsi by default, | |
| +but may also commonly be in /var/lib/iscsi. | |
| + | |
| +Configuration is contained in directories for: | |
| + | |
| +- nodes | |
| +- slp | |
| +- isns | |
| +- static | |
| +- fw | |
| +- send_targets | |
| +- ifaces | |
|   | |
|  The iscsiadm utility is a command-line tool to manage (update, delete, | |
|  insert, query) the persistent database. | |
| --  | |
| 1.7.2.3 | |
|  | |
|  | |
| From 2d086a831dc16d10729d6fce17bed3ade3efd16c Mon Sep 17 00:00:00 2001 | |
| From: Tomasz Torcz <[email protected]> | |
| Date: Wed, 28 Nov 2012 13:37:06 +0100 | |
| Subject: [PATCH] iscsid,iscsiadm: fix abstract socket length in bind() call | |
|  | |
| For abstract sockets, the addrlen parameter should be the actual | |
| length of socket's name.  Otherwise socket gets padded with some | |
| number of NULs. | |
| --- | |
|  usr/iscsid_req.c |   10 ++++++---- | |
|  usr/mgmt_ipc.c   |    9 +++++---- | |
|  2 files changed, 11 insertions(+), 8 deletions(-) | |
|  | |
| diff --git a/usr/iscsid_req.c b/usr/iscsid_req.c | |
| index 0902011..1c4678d 100644 | |
| --- a/usr/iscsid_req.c | |
| +++ b/usr/iscsid_req.c | |
| @@ -56,7 +56,7 @@ static void iscsid_startup(void) | |
|   | |
|  static int iscsid_connect(int *fd, int start_iscsid) | |
|  { | |
| -	int nsec; | |
| +	int nsec, addr_len; | |
|  	struct sockaddr_un addr; | |
|   | |
|  	*fd = socket(AF_LOCAL, SOCK_STREAM, 0); | |
| @@ -65,15 +65,17 @@ static int iscsid_connect(int *fd, int start_iscsid) | |
|  		return ISCSI_ERR_ISCSID_NOTCONN; | |
|  	} | |
|   | |
| +	addr_len = offsetof(struct sockaddr_un, sun_path) + strlen(ISCSIADM_NAMESPACE) + 1; | |
| + | |
|  	memset(&addr, 0, sizeof(addr)); | |
|  	addr.sun_family = AF_LOCAL; | |
| -	memcpy((char *) &addr.sun_path + 1, ISCSIADM_NAMESPACE, | |
| -		strlen(ISCSIADM_NAMESPACE)); | |
| +	memcpy((char *) &addr.sun_path + 1, ISCSIADM_NAMESPACE, addr_len); | |
| + | |
|  	/* | |
|  	 * Trying to connect with exponential backoff | |
|  	 */ | |
|  	for (nsec = 1; nsec <= MAXSLEEP; nsec <<= 1) { | |
| -		if (connect(*fd, (struct sockaddr *) &addr, sizeof(addr)) == 0) | |
| +		if (connect(*fd, (struct sockaddr *) &addr, addr_len) == 0) | |
|  			/* Connection established */ | |
|  			return ISCSI_SUCCESS; | |
|   | |
| diff --git a/usr/mgmt_ipc.c b/usr/mgmt_ipc.c | |
| index 5c39c2e..a1dafc9 100644 | |
| --- a/usr/mgmt_ipc.c | |
| +++ b/usr/mgmt_ipc.c | |
| @@ -43,7 +43,7 @@ | |
|  int | |
|  mgmt_ipc_listen(void) | |
|  { | |
| -	int fd, err; | |
| +	int fd, err, addr_len; | |
|  	struct sockaddr_un addr; | |
|   | |
|  	fd = socket(AF_LOCAL, SOCK_STREAM, 0); | |
| @@ -52,12 +52,13 @@ mgmt_ipc_listen(void) | |
|  		return fd; | |
|  	} | |
|   | |
| +	addr_len = offsetof(struct sockaddr_un, sun_path) + strlen(ISCSIADM_NAMESPACE) + 1; | |
| + | |
|  	memset(&addr, 0, sizeof(addr)); | |
|  	addr.sun_family = AF_LOCAL; | |
| -	memcpy((char *) &addr.sun_path + 1, ISCSIADM_NAMESPACE, | |
| -		strlen(ISCSIADM_NAMESPACE)); | |
| +	memcpy((char *) &addr.sun_path + 1, ISCSIADM_NAMESPACE, addr_len); | |
|   | |
| -	if ((err = bind(fd, (struct sockaddr *) &addr, sizeof(addr))) < 0) { | |
| +	if ((err = bind(fd, (struct sockaddr *) &addr, addr_len)) < 0 ) { | |
|  		log_error("Can not bind IPC socket"); | |
|  		close(fd); | |
|  		return err; | |
| --  | |
| 1.7.2.3 | |
|  | |
|  | |
| From 5d0e19fcc1cea77a72647cf96c5d3d773e8ee277 Mon Sep 17 00:00:00 2001 | |
| From: Tomasz Torcz <[email protected]> | |
| Date: Wed, 28 Nov 2012 13:37:07 +0100 | |
| Subject: [PATCH] iscsid: implement systemd-compatible socket activation | |
|  | |
| --- | |
|  usr/mgmt_ipc.c |   29 +++++++++++++++++++++++++++++ | |
|  usr/mgmt_ipc.h |    1 + | |
|  2 files changed, 30 insertions(+), 0 deletions(-) | |
|  | |
| diff --git a/usr/mgmt_ipc.c b/usr/mgmt_ipc.c | |
| index a1dafc9..87bd346 100644 | |
| --- a/usr/mgmt_ipc.c | |
| +++ b/usr/mgmt_ipc.c | |
| @@ -39,6 +39,7 @@ | |
|   | |
|  #define PEERUSER_MAX	64 | |
|  #define EXTMSG_MAX	(64 * 1024) | |
| +#define SD_SOCKET_FDS_START 3 | |
|   | |
|  int | |
|  mgmt_ipc_listen(void) | |
| @@ -46,6 +47,12 @@ mgmt_ipc_listen(void) | |
|  	int fd, err, addr_len; | |
|  	struct sockaddr_un addr; | |
|   | |
| +	/* first check if we have fd handled by systemd */ | |
| +	fd = mgmt_ipc_systemd(); | |
| +	if (fd >= 0) | |
| +		return fd; | |
| + | |
| +	/* manually establish a socket */ | |
|  	fd = socket(AF_LOCAL, SOCK_STREAM, 0); | |
|  	if (fd < 0) { | |
|  		log_error("Can not create IPC socket"); | |
| @@ -73,6 +80,28 @@ mgmt_ipc_listen(void) | |
|  	return fd; | |
|  } | |
|   | |
| +int mgmt_ipc_systemd(void) | |
| +{ | |
| +	const char *env; | |
| + | |
| +	env = getenv("LISTEN_PID"); | |
| + | |
| +	if (!env || (strtoul(env, NULL, 10) != getpid())) | |
| +		return -EINVAL; | |
| + | |
| +	env = getenv("LISTEN_FDS"); | |
| + | |
| +	if (!env) | |
| +		return -EINVAL; | |
| + | |
| +	if (strtoul(env, NULL, 10) != 1) { | |
| +		log_error("Did not receive exactly one IPC socket from systemd"); | |
| +		return -EINVAL; | |
| +	} | |
| + | |
| +	return SD_SOCKET_FDS_START; | |
| +} | |
| + | |
|  void | |
|  mgmt_ipc_close(int fd) | |
|  { | |
| diff --git a/usr/mgmt_ipc.h b/usr/mgmt_ipc.h | |
| index 7d8ce72..55972ed 100644 | |
| --- a/usr/mgmt_ipc.h | |
| +++ b/usr/mgmt_ipc.h | |
| @@ -112,6 +112,7 @@ typedef int mgmt_ipc_fn_t(struct queue_task *); | |
|  struct queue_task; | |
|  void mgmt_ipc_write_rsp(struct queue_task *qtask, int err); | |
|  int mgmt_ipc_listen(void); | |
| +int mgmt_ipc_systemd(void); | |
|  void mgmt_ipc_close(int fd); | |
|  void mgmt_ipc_handle(int accept_fd); | |
|   | |
| --  | |
| 1.7.2.3 | |
|  | |
|  | |
| From c34e0bdcbafdb6f9304e1474d51fe1c789c5dea2 Mon Sep 17 00:00:00 2001 | |
| From: Tomasz Torcz <[email protected]> | |
| Date: Wed, 28 Nov 2012 13:37:08 +0100 | |
| Subject: [PATCH] iscsid: add example unit files for systemd | |
| MIME-Version: 1.0 | |
| Content-Type: text/plain; charset=UTF-8 | |
| Content-Transfer-Encoding: 8bit | |
|  | |
| Those two units, based on the work by Jóhann B. Guðmundsson, exploit | |
| on-demand socket activation in iscsid. | |
| --- | |
|  etc/systemd/iscsid.service |   13 +++++++++++++ | |
|  etc/systemd/iscsid.socket  |    9 +++++++++ | |
|  2 files changed, 22 insertions(+), 0 deletions(-) | |
|  create mode 100644 etc/systemd/iscsid.service | |
|  create mode 100644 etc/systemd/iscsid.socket | |
|  | |
| diff --git a/etc/systemd/iscsid.service b/etc/systemd/iscsid.service | |
| new file mode 100644 | |
| index 0000000..028e0b3 | |
| --- /dev/null | |
| +++ b/etc/systemd/iscsid.service | |
| @@ -0,0 +1,13 @@ | |
| +[Unit] | |
| +Description=Open-iSCSI | |
| +Documentation=man:iscsid(8) man:iscsiuio(8) man:iscsiadm(8) | |
| +After=network.target NetworkManager-wait-online.service iscsiuio.service tgtd.service targetcli.service | |
| + | |
| +[Service] | |
| +Type=forking | |
| +PIDFile=/var/run/iscsid.pid | |
| +ExecStart=/usr/sbin/iscsid | |
| +ExecStop=/sbin/iscsiadm -k 0 2 | |
| + | |
| +[Install] | |
| +WantedBy=multi-user.target | |
| diff --git a/etc/systemd/iscsid.socket b/etc/systemd/iscsid.socket | |
| new file mode 100644 | |
| index 0000000..832451d | |
| --- /dev/null | |
| +++ b/etc/systemd/iscsid.socket | |
| @@ -0,0 +1,9 @@ | |
| +[Unit] | |
| +Description=Open-iSCSI iscsid Socket | |
| +Documentation=man:iscsid(8) man:iscsiuio(8) man:iscsiadm(8) | |
| + | |
| +[Socket] | |
| +ListenStream=@ISCSIADM_ABSTRACT_NAMESPACE | |
| + | |
| +[Install] | |
| +WantedBy=sockets.target | |
| --  | |
| 1.7.2.3 | |
|  | |
|  | |
| From a7afdf46c3193eb102cc6ec2a3b61e8d36794437 Mon Sep 17 00:00:00 2001 | |
| From: Mike Christie <[email protected]> | |
| Date: Fri, 14 Dec 2012 12:40:27 -0600 | |
| Subject: [PATCH] iscsi tools: fix get_random_bytes error handling | |
|  | |
| Bug report from Rahul: | |
|  | |
| There seems to be a bug in function get_random_bytes(). I reported | |
| this earlier as well but somehow it didn't appear here. | |
|  | |
| get_random_bytes(unsigned char *data, unsigned int length) | |
| { | |
| 	long r; | |
|         unsigned n; | |
| 	int fd; | |
|  | |
| 	fd = open("/dev/urandom", O_RDONLY); | |
|         	while (length > 0) { | |
|  | |
| 	if (!fd || read(fd, &r, sizeof(long)) != -1)      <<<< the condition is | |
| incorrect | |
| --- | |
|  usr/auth.c |    8 ++++---- | |
|  1 files changed, 4 insertions(+), 4 deletions(-) | |
|  | |
| diff --git a/usr/auth.c b/usr/auth.c | |
| index c924545..4ff0425 100644 | |
| --- a/usr/auth.c | |
| +++ b/usr/auth.c | |
| @@ -189,24 +189,24 @@ get_random_bytes(unsigned char *data, unsigned int length) | |
|   | |
|  	long r; | |
|          unsigned n; | |
| -	int fd; | |
| +	int fd, r_size = sizeof(r); | |
|   | |
|  	fd = open("/dev/urandom", O_RDONLY); | |
|          while (length > 0) { | |
|   | |
| -		if (!fd || read(fd, &r, sizeof(long)) != -1) | |
| +		if (fd == -1 || read(fd, &r, r_size) != r_size) | |
|  			r = rand(); | |
|                  r = r ^ (r >> 8); | |
|                  r = r ^ (r >> 4); | |
|                  n = r & 0x7; | |
|   | |
| -		if (!fd || read(fd, &r, sizeof(long)) != -1) | |
| +		if (fd == -1 || read(fd, &r, r_size) != r_size) | |
|  			r = rand(); | |
|                  r = r ^ (r >> 8); | |
|                  r = r ^ (r >> 5); | |
|                  n = (n << 3) | (r & 0x7); | |
|   | |
| -		if (!fd || read(fd, &r, sizeof(long)) != -1) | |
| +		if (fd == -1 || read(fd, &r, r_size) != r_size) | |
|  			r = rand(); | |
|                  r = r ^ (r >> 8); | |
|                  r = r ^ (r >> 5); | |
| --  | |
| 1.7.2.3 | |
| 
 | |
| 
 |