Re: CS_SERVERADDR tag is not handled correctly in ct_con_props

Stephen Marshall <[email protected]>
Newsgroups gmane.comp.db.tds.freetds
Message-ID <CAJX-rPMnQ5w8Fgy9REL=aNLVG44Bzgdky3nYhkgwf2wYc7xaiA@mail.gmail.com>
Frediano,

Thanks for looking into this.  I also find the code a bit confusing.  My
answers to your comments are interspersed below.

Steve


On Thu, Jan 9, 2014 at 7:03 PM, Frediano Ziglio <[email protected]> wrote:

> 2014/1/6 Stephen Marshall <[email protected]>:
> > On Mon, Jan 6, 2014 at 12:21 PM, Frediano Ziglio <[email protected]>
> wrote:
> >
> >> 2014/1/6 Stephen Marshall <[email protected]>:
> >> > Let me try to explain in better detail:
> >> >
> >> > Problem:
> >> > The CS_SERVERADDR enum is not properly honored in the ct_con_props
> >> function
> >> > call.
> >> > For example, this call should effectively set the host and port for a
> DB
> >> > connection, but it results in an error when the connection
> information is
> >> > actually used.
> >> >     ct_con_props( g_connection,
> >> >                       CS_SET,
> >> >                       CS_SERVERADDR,
> >> >                       (CS_VOID*)server,
> >> >                       CS_NULLTERM,
> >> >                       (CS_INT*)NULL
> >> >                     );
> >> > Here: g_connection is a pointer to type CS_CONNECTION, and server is
> text
> >> > of the form "<host> <port>".  Note that FreeTDS provides other ways to
> >> > specify host and port (e.g. setting the server parameter to
> >> > "<host>:<port>"; however, the method using CS_SERVERADDR does not
> work.
> >> >
> >>
> >> Now I got it.
> >>
> >> > Approaches to fix:
> >> > I see two ways to attack this problem.  Of course, you may see others.
> >> >
> >> > One approach is to ensure port information is set in the CS_CONNECTION
> >> data
> >> > structures and then passed to the other internal data structures used
> to
> >> > establish a connection in FreeTDS.  This would be a true fix to the
> >> > problem, but would require some changes to at least a few internal
> data
> >> > structures.
> >> >
> >> > Another approach is the mark the CS_SERVERADDR tag as disabled in
> >> FreeTDS.
> >> >  This would not actually fix the problem, but would allow client
> >> > applications to work around the limitation.  However, I think this
> can be
> >> > achieved by simply undefining CS_SERVERADDR in cspublic.h.
> >> >
> >> > If you have any thoughts on ways to fix this, I'm certainly open to
> >> > suggestions.
> >> >
> >> > Steve
> >> >
> >>
> >> Well, as Sybase write specification while we should stick to it we
> >> should just handle properly this tag. Perhaps the problem is how to
> >> fit this with other port specification. Should CS_SERVERADDR port
> >> override CS_SERVERNAME "host:port" FreeTDS syntax? Perhaps we should
> >> just document the combination as not supported or undefined behaviour.
> >>
> >
> >
> > You raise an interesting idea to use CS_SERVERADDR to set the
> > CS_SERVERNAME.   This seems easier than either of my suggestions.  The
> main
> > complexity is that servername is passed directly to the ct_connect
> > function, while CS_SERVERADDR is set ahead of time in the CS_CONNECTION
> > data structure.
> >
> > I have implemented your suggestion in the attached patch file for
> > src/ctlib/ct.c.   This required small changes to both ct_con_props and
> > ct_connect.  I tested this change using sqsh 2.4, but creating a test
> > within FreeTDS itself would be a good idea.
> >
> > Let me know if this looks ok to you.   The part where I changed how
> > not-NULL values of con->server_addr are interpreted in ct_connect is the
> > only change that may be prone to side effects.  The previous logic
> appears
> > to have ignored any server_addr setting that was previously made.  Now
> > server_addr settings override the server name passed into ct_connect.
> >
> >
> >
> Hi,
>   I was looking at your patch and at Gerhard one. They really touch
> same piece of code fixing (it seems) different things. The patch from
> Gerhard just add name resolution if a CS_SERVERADDR is passed while
> your avoid to parse configuration name (or perhaps do you have same
> problem raised by Gerhard?). Looking at the code... well... is not
> easy to understand what's is doing! Some points:
> - Sybase server name can be different from dns name but your patch
> just use dns name so we'll have problems with Sybase servers;
>
[Steve]  - The CS_SERVERADDR is suppose to use host and port, not Sybase
server name, so I think this is appropriate.

- name resolution should be done so Gerhard patch is correct (I don't
> understand why name resolution is not done in a single place);
>
[Steve] - I thought hostname resolution (dns name to ip address) was done
at a lower level.

> - current code is actually wrong as it ignores servername passed to
> ct_connect if CS_SERVERADDR is used. None of the two patches fix this
> issue;
>
[Steve] - Since server name is primarily used to lookup host and port, you
really only have two choices if both are specified:
1. Prefer server name passed to ct_connect of CS_SERVERADDR
2. Prefer CS_SERVERADDR over server name

The code previoulsy did #1, my patch changed it to do #2.  The rationale
for this was based on behavior in sqsh using both FreeTDS and Sybase
ctlib.  When the -S <host>:<port> syntax is used, sqsh passes host and port
as a CS_SERVERADDR parameter AND it passes the <host>:<port> string as the
servername to ct_connect.  When sqsh is linked against ctlib, the
CS_SERVERADDR values were honored, indicating ctlib used method #2.
Therefore, I think changing FreeTDS to use method #2 would be a good idea.


- is not clear what the difference setting server to NULL or "";
>
[Steve] - I don't know either.

> - should configuration NEVER be read if CS_SERVERADDR is used?

[Steve] - The only additional issue to what I discussed above is the case
where you could look up parameters other than host and port by server name,
e.g. tds version or client charset.  However, I think that if someone is
explicitly passing host and port numbers, it is unlikely they are relying
on the configuration file for anything, so I don't think this would be bad
behavior.  In other words, if CS_SERVERADDR is used, client should be
expect to ct_con_props to set other pieces of configuration, like protocol
version, client character encoding.

Looking at libTDS code (tds_read_config_info) seems that an attempt to read
> configuration is always done, even for server:port syntax. However
> setting server_name to "" should cause only global section to be
> parsed.
>
> Well.. just trying to collect some details... no solution yet.
> Possibly Gerhard patch adding set to server_name after reading
> configuration if servername is valid and CS_SERVERADDR is used (in the
> "if (con->server_addr)" statement) ?
>
> Frediano
> _______________________________________________
> FreeTDS mailing list
> [email protected]
> http://lists.ibiblio.org/mailman/listinfo/freetds
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.