[freetds] minor fixes.

Craig A. Berry craigberry at mac.com
Sun Jun 27 15:04:40 EDT 2010


On Jun 23, 2010, at 4:48 PM, Christos Zoulas wrote:

> Hello,
>
> 1. add a getpassarg() function and use it in all applications that
>   get a password from the command line. This overwrites the command
>   line provided password with stars for a bit more security.

Thanks for noticing that we leave the password sitting there in memory  
if -P happens to be the last option processed. That could be rectified  
with a simple memset() (or, better, IMO, bzero()).  It looks like your  
function also reads the password from stdin if someone specifies -P-,  
but it does so without calling getpass() or readpassphrase(), so  
echoing will not be suppressed nor any other longstanding security  
goodness provided by those tried and true functions.

You could make your function call readpassphrase() instead of reading  
from stdin itself, but I would rather see the same behavior as the  
vendor utilities have implemented consistently, i.e., from the Sybase  
docs, "If you do not specify the -P flag, isql prompts for a  
password."  I think some of our utilities do that and some don't.

> 2. add a -a <name> argument to TSQL so that we can specify the  
> "application
>   name" in the sql process table.

For the Sybase client, -a means "display_charset" and for Microsoft  
clients it means "packetsize" (which is -A for Sybase).  I guess we  
could be inconsistent for tsql, but I don't really understand the need  
for this feature.  The application is tsql, so why would you want to  
have it show up as something else?

> 3. if you could not find a specific host in the configuration  
> section, don't
>   fail, just try with the global settings as before.

But if we didn't find them before, how would we find them by doing the  
same thing again?

> What's up with the nightly snapshot? I have not seen a new one since  
> 20100522?

I think they've been working the last couple of nights.

>
> christos
>
> Index: include/replacements.h
> ===================================================================
> RCS file: /src/twosigma/cvsroot/external/public/freetds/include/ 
> replacements.h,v
> retrieving revision 1.1.1.7
> retrieving revision 1.2
> diff -u -u -r1.1.1.7 -r1.2
> --- include/replacements.h	7 Jun 2010 14:37:14 -0000	1.1.1.7
> +++ include/replacements.h	23 Jun 2010 21:16:31 -0000	1.2
> @@ -95,6 +95,8 @@
> #else
> char *tds_basename(char *path);
> #endif
> +
> +char *getpassarg(char *arg);
>
> /*
>  * Microsoft's C Runtime library is missing strcasecmp and  
> strncasecmp.
> Index: src/apps/bsqldb.c
> ===================================================================
> RCS file: /src/twosigma/cvsroot/external/public/freetds/src/apps/ 
> bsqldb.c,v
> retrieving revision 1.1.1.6
> retrieving revision 1.2
> diff -u -u -r1.1.1.6 -r1.2
> --- src/apps/bsqldb.c	7 Jun 2010 14:37:14 -0000	1.1.1.6
> +++ src/apps/bsqldb.c	23 Jun 2010 21:16:31 -0000	1.2
> @@ -795,7 +795,7 @@
> {
> 	LOGINREC *login;
> 	int ch;
> -	int got_password = 0;
> +	char *password = NULL;
>
> 	extern char *optarg;
>
> @@ -825,8 +825,8 @@
> 			DBSETLUSER(login, optarg);
> 			break;
> 		case 'P':
> -			got_password = 1;
> -			DBSETLPWD(login, optarg);
> +			password = getpassarg(optarg);
> +			DBSETLPWD(login, password);
> 			break;
> 		case 'S':
> 			options->servername = strdup(optarg);
> @@ -864,11 +864,11 @@
> 		}
> 	}
>
> -	if (!got_password) {
> -		char password[128];
> +	if (password == NULL) {
> +		char pwd[128];
>
> -		readpassphrase("Password: ", password, sizeof(password),  
> RPP_ECHO_OFF);
> -		DBSETLPWD(login, password);
> +		readpassphrase("Password: ", pwd, sizeof(pwd), RPP_ECHO_OFF);
> +		DBSETLPWD(login, pwd);
>         }
>
> 	if (!options->servername) {
> Index: src/apps/bsqlodbc.c
> ===================================================================
> RCS file: /src/twosigma/cvsroot/external/public/freetds/src/apps/ 
> bsqlodbc.c,v
> retrieving revision 1.1.1.3
> retrieving revision 1.2
> diff -u -u -r1.1.1.3 -r1.2
> --- src/apps/bsqlodbc.c	7 Jun 2010 14:37:14 -0000	1.1.1.3
> +++ src/apps/bsqlodbc.c	23 Jun 2010 21:16:31 -0000	1.2
> @@ -839,7 +839,7 @@
> 			login->username = strdup(optarg);
> 			break;
> 		case 'P':
> -			login->password = strdup(optarg);
> +			login->password = getpassarg(optarg);
> 			break;
> 		case 'S':
> 			options->servername = strdup(optarg);
> Index: src/apps/defncopy.c
> ===================================================================
> RCS file: /src/twosigma/cvsroot/external/public/freetds/src/apps/ 
> defncopy.c,v
> retrieving revision 1.1.1.5
> retrieving revision 1.2
> diff -u -u -r1.1.1.5 -r1.2
> --- src/apps/defncopy.c	7 Jun 2010 14:37:14 -0000	1.1.1.5
> +++ src/apps/defncopy.c	23 Jun 2010 21:16:31 -0000	1.2
> @@ -643,6 +643,7 @@
> get_login(int argc, char *argv[], OPTIONS *options)
> {
> 	LOGINREC *login;
> +	char *password;
> 	int ch;
> 	int fdomain = TRUE;
>
> @@ -673,7 +674,8 @@
> 			fdomain = FALSE;
> 			break;
> 		case 'P':
> -			DBSETLPWD(login, optarg);
> +			password = getpassarg(optarg);
> +			DBSETLPWD(login, password);
> 			fdomain = FALSE;
> 			break;
> 		case 'S':
> Index: src/apps/freebcp.c
> ===================================================================
> RCS file: /src/twosigma/cvsroot/external/public/freetds/src/apps/ 
> freebcp.c,v
> retrieving revision 1.1.1.10
> retrieving revision 1.2
> diff -u -u -r1.1.1.10 -r1.2
> --- src/apps/freebcp.c	7 Jun 2010 14:37:14 -0000	1.1.1.10
> +++ src/apps/freebcp.c	23 Jun 2010 21:16:31 -0000	1.2
> @@ -256,16 +256,7 @@
> 			break;
> 		case 'P':
> 			pdata->Pflag++;
> -			if ((strcmp(optarg, "-")) == 0) {
> -				char pwd[255], *nl;
> -				memset(pwd, 0, 255);
> -				fgets(pwd, 255, stdin);
> -				nl = strchr(pwd, '\n');
> -				if(nl) *nl = '\0';
> -				pdata->pass = strdup(pwd);
> -			} else {
> -				pdata->pass = strdup(optarg);
> -			}
> +			pdata->pass = getpassarg(optarg);
> 			break;
> 		case 'i':
> 			free(pdata->inputfile);
> Index: src/apps/tsql.c
> ===================================================================
> RCS file: /src/twosigma/cvsroot/external/public/freetds/src/apps/ 
> tsql.c,v
> retrieving revision 1.1.1.10
> retrieving revision 1.19
> diff -u -u -r1.1.1.10 -r1.19
> --- src/apps/tsql.c	7 Jun 2010 14:37:14 -0000	1.1.1.10
> +++ src/apps/tsql.c	23 Jun 2010 21:16:31 -0000	1.19
> @@ -297,7 +297,7 @@
> tsql_print_usage(const char *progname)
> {
> 	fprintf(stderr,
> -		"Usage:\t%s [-S <server> | -H <hostname> -p <port>] -U <username>  
> [-P <password>] [-I <config file>] [-o <options>] [-t delim] [-r  
> delim] [-D database]\n"
> +		"Usage:\t%s [-a <appname>] [-S <server> | -H <hostname> -p  
> <port>] -U <username> [-P <password>] [-I <config file>] [-o  
> <options>] [-t delim] [-r delim] [-D database]\n"
> 		"\t%s -C\n"
> 		"Options:\n"
> 		"\tf\tDo not print footer\n"
> @@ -402,6 +405,7 @@
> 	char *confile = NULL;
> 	int port = 0;
> 	int opt;
> +	const char *appname = "TSQL";
> 	const char *locale = NULL;
> 	const char *charset = NULL;
> 	char *opt_flags_str = NULL;
> @@ -418,8 +422,11 @@
> #endif
>
>
> -	while ((opt = getopt(argc, argv, "H:S:I:P:U:p:Co:t:r:D:Lv")) !=  
> -1) {
> +	while ((opt = getopt(argc, argv, "a:H:S:I:P:U:p:Co:t:r:D:Lv")) !=  
> -1) {
> 		switch (opt) {
> +		case 'a':
> +			appname = optarg;
> +			break;
> 		case 't':
> 			opt_col_term = strdup(optarg);
> 			break;
> @@ -446,7 +453,7 @@
> 			break;
> 		case 'P':
> 			free(password);
> -			password = strdup(optarg);
> +			password = getpassarg(optarg);
> 			break;
> 		case 'I':
> 			free(confile);
> @@ -579,7 +586,7 @@
> 	/* if it's a servername */
> 	if (servername) {
> 		tds_set_user(login, username);
> -		tds_set_app(login, "TSQL");
> +		tds_set_app(login, appname);
> 		tds_set_library(login, "TDS-Library");
> 		tds_set_server(login, servername);
> 		tds_set_client_charset(login, charset);
> @@ -591,7 +598,7 @@
> 		/* else we specified hostname/port */
> 	} else {
> 		tds_set_user(login, username);
> -		tds_set_app(login, "TSQL");
> +		tds_set_app(login, appname);
> 		tds_set_library(login, "TDS-Library");
> 		tds_set_server(login, hostname);
> 		tds_set_port(login, port);
> Index: src/apps/fisql/fisql.c
> ===================================================================
> RCS file: /src/twosigma/cvsroot/external/public/freetds/src/apps/ 
> fisql/fisql.c,v
> retrieving revision 1.1.1.2
> retrieving revision 1.2
> diff -u -u -r1.1.1.2 -r1.2
> --- src/apps/fisql/fisql.c	7 Jun 2010 14:37:14 -0000	1.1.1.2
> +++ src/apps/fisql/fisql.c	23 Jun 2010 21:16:32 -0000	1.2
> @@ -345,7 +345,7 @@
> 			output_filename = optarg;
> 			break;
> 		case 'P':
> -			password = optarg;
> +			password = getpassarg(optarg);
> 			break;
> 		case 's':
> 			colseparator = optarg;
> Index: src/replacements/Makefile.am
> ===================================================================
> RCS file: /src/twosigma/cvsroot/external/public/freetds/src/ 
> replacements/Makefile.am,v
> retrieving revision 1.1.1.8
> retrieving revision 1.2
> diff -u -u -r1.1.1.8 -r1.2
> --- src/replacements/Makefile.am	7 Jun 2010 14:37:14 -0000	1.1.1.8
> +++ src/replacements/Makefile.am	23 Jun 2010 21:16:33 -0000	1.2
> @@ -1,7 +1,7 @@
> -# $Id: Makefile.am,v 1.1.1.8 2010/06/07 14:37:14 christos Exp $
> +# $Id: Makefile.am,v 1.2 2010/06/23 21:16:33 christos Exp $
> AM_CPPFLAGS=			-I$(top_srcdir)/include -I$(top_srcdir)/src/ 
> replacements
> noinst_LTLIBRARIES=		libreplacements.la
> -libreplacements_la_SOURCES=	iconv.c gettimeofday.c fakepoll.c
> +libreplacements_la_SOURCES=	iconv.c gettimeofday.c fakepoll.c  
> getpassarg.c
> libreplacements_la_LDFLAGS=
> libreplacements_la_LIBADD=	@LTLIBOBJS@
> EXTRA_DIST=	asprintf.c \
> Index: src/replacements/getpassarg.c
> ===================================================================
> RCS file: src/replacements/getpassarg.c
> diff -N src/replacements/getpassarg.c
> --- /dev/null	1 Jan 1970 00:00:00 -0000
> +++ src/replacements/getpassarg.c	23 Jun 2010 21:36:33 -0000
> @@ -0,0 +1,74 @@
> +/* FreeTDS - Library of routines accessing Sybase and Microsoft  
> databases
> + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005   
> Brian Bruns
> + * Copyright (C) 2006, 2007, 2008, 2009, 2010  Frediano Ziglio
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Library General Public
> + * License as published by the Free Software Foundation; either
> + * version 2 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Library General Public License for more details.
> + *
> + * You should have received a copy of the GNU Library General Public
> + * License along with this library; if not, write to the
> + * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
> + * Boston, MA 02111-1307, USA.
> + */
> +
> +#if HAVE_CONFIG_H
> +#include <config.h>
> +#endif
> +
> +#include <stdio.h>
> +
> +#if HAVE_LIMITS_H
> +#include <limits.h>
> +#endif
> +
> +#if HAVE_STRING_H
> +#include <string.h>
> +#endif /* HAVE_STRING_H */
> +
> +#include <tds.h>
> +#include <tdsthread.h>
> +#include <tdsconvert.h>
> +#include <replacements.h>
> +#include <sybfront.h>
> +#include <sybdb.h>
> +#include <syberror.h>
> +#include <dblib.h>
> +
> +#ifdef DMALLOC
> +#include <dmalloc.h>
> +#endif
> +
> +TDS_RCSID(var, "$Id: getpass.c,v 1.1.1.14 2010/06/07 14:37:14  
> christos Exp $");
> +
> +/*
> + * return a copy of the password, reading from stdin if arg is '-'
> + * trashing he argument in the process.
> + */
> +char *
> +getpassarg(char *arg)
> +{
> +	char pwd[255], *ptr, *q;
> +
> +	if (strcmp(arg, "-") == 0) {
> +		memset(pwd, 0, sizeof(pwd));
> +		if (fgets(pwd, sizeof(pwd), stdin) == NULL)
> +			return NULL;
> +		ptr = strchr(pwd, '\n');
> +		if (ptr) *ptr = '\0';
> +		arg = pwd;
> +	}
> +
> +	ptr = strdup(arg);
> +
> +	for (q = arg; *q; *q++ = '*')
> +		continue;
> +
> +	return ptr;
> +}
> Index: src/tds/config.c
> ===================================================================
> RCS file: /src/twosigma/cvsroot/external/public/freetds/src/tds/ 
> config.c,v
> retrieving revision 1.1.1.14
> retrieving revision 1.17
> diff -u -u -r1.1.1.14 -r1.17
> --- src/tds/config.c	7 Jun 2010 14:37:14 -0000	1.1.1.14
> +++ src/tds/config.c	7 Jun 2010 15:07:21 -0000	1.17
> @@ -202,7 +202,11 @@
> 		if (!tds_read_interfaces(tds_dstr_cstr(&login->server_name),  
> connection)) {
> 			tdsdump_log(TDS_DBG_INFO1, "Failed to find [%s] in configuration  
> files; trying '%s' instead.\n",
> 						   tds_dstr_cstr(&login->server_name),  
> tds_dstr_cstr(&connection->server_name));
> +#if 1
> +			if (!tds_read_conf_file(connection, tds_dstr_cstr(&connection- 
> >server_name)))
> +#else
> 			if (tds_dstr_isempty(&connection->ip_addr))
> +#endif
> 				tdserror(tds->tds_ctx, tds, TDSEINTF, 0);
> 		}
> 	}
> _______________________________________________
> FreeTDS mailing list
> FreeTDS at lists.ibiblio.org
> http://lists.ibiblio.org/mailman/listinfo/freetds

________________________________________
Craig A. Berry
mailto:craigberry at mac.com

"... getting out of a sonnet is much more
  difficult than getting in."
                  Brad Leithauser




More information about the FreeTDS mailing list