Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 302473 Details for
Bug 439047
Bitlbee 1.2 is released, update required
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
[patch]
Attempt to remedy the situation
no-bind.diff (text/plain), 9.75 KB, created by
Matěj Cepl
on 2008-04-15 15:11:31 UTC
(
hide
)
Description:
Attempt to remedy the situation
Filename:
MIME Type:
Creator:
Matěj Cepl
Created:
2008-04-15 15:11:31 UTC
Size:
9.75 KB
patch
obsolete
>diff --git a/lib/Makefile b/lib/Makefile >index 03fef1a..c8b87b8 100644 >--- a/lib/Makefile >+++ b/lib/Makefile >@@ -9,7 +9,7 @@ > -include ../Makefile.settings > > # [SH] Program variables >-objects = arc.o base64.o $(EVENT_HANDLER) http_client.o ini.o md5.o misc.o proxy.o sha1.o $(SSL_CLIENT) url.o xmltree.o >+objects = arc.o base64.o $(EVENT_HANDLER) http_client.o ini.o md5.o misc.o proxy.o sha1.o srv.o $(SSL_CLIENT) url.o xmltree.o > > CFLAGS += -Wall > LFLAGS += -r >diff --git a/lib/misc.c b/lib/misc.c >index ccf208b..c31ab57 100644 >--- a/lib/misc.c >+++ b/lib/misc.c >@@ -43,6 +43,7 @@ > #ifdef HAVE_RESOLV_A > #include <arpa/nameser.h> > #include <resolv.h> >+#include <netinet/in.h> > #endif > > #include "ssl_client.h" >@@ -490,58 +491,6 @@ int bool2int( char *value ) > return 0; > } > >-struct ns_srv_reply *srv_lookup( char *service, char *protocol, char *domain ) >-{ >- struct ns_srv_reply *reply = NULL; >-#ifdef HAVE_RESOLV_A >- char name[1024]; >- unsigned char querybuf[1024]; >- const unsigned char *buf; >- ns_msg nsh; >- ns_rr rr; >- int i, len, size; >- >- g_snprintf( name, sizeof( name ), "_%s._%s.%s", service, protocol, domain ); >- >- if( ( size = res_query( name, ns_c_in, ns_t_srv, querybuf, sizeof( querybuf ) ) ) <= 0 ) >- return NULL; >- >- if( ns_initparse( querybuf, size, &nsh ) != 0 ) >- return NULL; >- >- if( ns_parserr( &nsh, ns_s_an, 0, &rr ) != 0 ) >- return NULL; >- >- size = ns_rr_rdlen( rr ); >- buf = ns_rr_rdata( rr ); >- >- len = 0; >- for( i = 6; i < size && buf[i]; i += buf[i] + 1 ) >- len += buf[i] + 1; >- >- if( i > size ) >- return NULL; >- >- reply = g_malloc( sizeof( struct ns_srv_reply ) + len ); >- memcpy( reply->name, buf + 7, len ); >- >- for( i = buf[6]; i < len && buf[7+i]; i += buf[7+i] + 1 ) >- reply->name[i] = '.'; >- >- if( i > len ) >- { >- g_free( reply ); >- return NULL; >- } >- >- reply->prio = ( buf[0] << 8 ) | buf[1]; >- reply->weight = ( buf[2] << 8 ) | buf[3]; >- reply->port = ( buf[4] << 8 ) | buf[5]; >-#endif >- >- return reply; >-} >- > /* Word wrapping. Yes, I know this isn't UTF-8 clean. I'm willing to take the risk. */ > char *word_wrap( char *msg, int line_len ) > { >diff --git a/lib/misc.h b/lib/misc.h >index a2acada..1c1b97a 100644 >--- a/lib/misc.h >+++ b/lib/misc.h >@@ -28,14 +28,7 @@ > > #include <gmodule.h> > #include <time.h> >- >-struct ns_srv_reply >-{ >- int prio; >- int weight; >- int port; >- char name[]; >-}; >+#include "srv.h" > > G_MODULE_EXPORT void strip_linefeed( gchar *text ); > G_MODULE_EXPORT char *add_cr( char *text ); >diff --git a/lib/srv.c b/lib/srv.c >new file mode 100644 >index 0000000..20cf782 >--- /dev/null >+++ b/lib/srv.c >@@ -0,0 +1,242 @@ >+/* srv.c - DNS SRV code >+ * Copyright (C) 2003 Free Software Foundation, Inc. >+ * >+ * This file is part of GNUPG. >+ * >+ * GNUPG is free software; you can redistribute it and/or modify >+ * it under the terms of the GNU General Public License as published by >+ * the Free Software Foundation; either version 3 of the License, or >+ * (at your option) any later version. >+ * >+ * GNUPG 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 General Public License for more details. >+ * >+ * You should have received a copy of the GNU General Public License >+ * along with this program; if not, see <http://www.gnu.org/licenses/>. >+ */ >+ >+#undef TEST >+ >+#ifdef TEST >+#define HAVE_RESOLV_A >+#endif >+ >+/*#include <config.h>*/ >+#include <sys/types.h> >+ >+#include <unistd.h> >+#include <stdlib.h> >+#include <string.h> >+#include <time.h> >+ >+#include "srv.h" >+#include <glib.h> >+#include <glib/gprintf.h> >+#include <glib/gutils.h> >+ >+/* Not every installation has gotten around to supporting SRVs >+ yet...*/ >+#ifndef T_SRV >+#define T_SRV 33 >+#endif >+ >+static int priosort(const void *a, const void *b) { >+ const struct ns_srv_reply *sa=a, *sb=b; >+ if (sa->prio>sb->prio) >+ return 1; >+ else if (sa->prio<sb->prio) >+ return -1; >+ else >+ return 0; >+} >+ >+struct ns_srv_reply *srv_lookup(char *service, char *protocol, char *domain) { >+ struct ns_srv_reply *reply = NULL; >+ struct ns_srv_reply *list; >+ char name[1024]; >+#ifdef HAVE_RESOLV_A >+ unsigned char answer[PACKETSZ]; >+ int r, srvcount=0; >+ unsigned char *pt, *emsg; >+ int count, dlen; >+ >+ list = NULL; >+ >+ g_snprintf(name, sizeof(name ), "_%s._%s.%s", service, protocol, domain); >+ >+ _res.options |= RES_DEBUG; >+ >+ if ( res_init() != 0 ) >+ return NULL; >+ >+ r=res_query(name, C_IN, T_SRV, answer, PACKETSZ); >+ >+ if (r<sizeof(HEADER) || r>PACKETSZ) >+ return NULL; >+ >+ if ((((HEADER *)answer)->rcode)==NOERROR && (count=ntohs(((HEADER *)answer)->ancount))) { >+ int i, rc; >+ >+ emsg=&answer[r]; /* end of message ??? */ >+ pt=&answer[sizeof(HEADER)]; >+ >+ /* Skip over the query */ >+ rc=dn_skipname(pt, emsg); >+ if (rc==-1) >+ goto fail; >+ >+ pt+=rc+QFIXEDSZ; >+ >+ while (count-->0 && pt<emsg) { >+ struct ns_srv_reply *srv=NULL; >+ int type, class; >+ >+ list=g_realloc(list, (srvcount+1)*sizeof(struct ns_srv_reply)); >+ memset(&list[srvcount], 0, sizeof(struct ns_srv_reply)); >+ srv=&list[srvcount]; >+ srvcount++; >+ >+ rc=dn_skipname(pt, emsg); /* the name we just queried for */ >+ if (rc==-1) >+ goto fail; >+ pt+=rc; >+ >+ /* Truncated message? */ >+ if ((emsg-pt)<16) >+ goto fail; >+ >+ type=*pt++ << 8; >+ type|=*pt++; >+ /* We asked for SRV and got something else !? */ >+ if (type!=T_SRV) >+ goto fail; >+ >+ class=*pt++ << 8; >+ class|=*pt++; >+ /* We asked for IN and got something else !? */ >+ if (class!=C_IN) >+ goto fail; >+ >+ pt+=4; /* ttl */ >+ dlen=*pt++ << 8; >+ dlen|=*pt++; >+ srv->prio=*pt++ << 8; >+ srv->prio|=*pt++; >+ srv->weight=*pt++ << 8; >+ srv->weight|=*pt++; >+ srv->port=*pt++ << 8; >+ srv->port|=*pt++; >+ >+ /* Get the name. 2782 doesn't allow name compression, but >+ dn_expand still works to pull the name out of the >+ packet. */ >+ rc=dn_expand(answer, emsg, pt, srv->name, MAXDNAME); >+ if (rc==1 && srv->name[0]==0) /* "." */ >+ goto noanswer; >+ if (rc==-1) >+ goto fail; >+ pt+=rc; >+ /* Corrupt packet? */ >+ if (dlen!=rc+6) >+ goto fail; >+ } >+ >+ /* Now we have an array of all the srv records. */ >+ >+ /* Order by priority */ >+ qsort(list, srvcount, sizeof(struct ns_srv_reply), priosort); >+ >+ /* For each priority, move the zero-weighted items first. */ >+ for (i=0; i<srvcount; i++) { >+ int j; >+ >+ for (j=i; j<srvcount && list[i].prio==list[j].prio; j++) { >+ if (list[j].weight==0) { >+ /* Swap j with i */ >+ if (j!=i) { >+ struct ns_srv_reply temp; >+ >+ memcpy(&temp, &list[j], sizeof(struct ns_srv_reply)); >+ memcpy(&list[j], &list[i], sizeof(struct ns_srv_reply)); >+ memcpy(&list[i], &temp, sizeof(struct ns_srv_reply)); >+ } >+ >+ break; >+ } >+ } >+ } >+ >+ /* Run the RFC-2782 weighting algorithm. We don't need very >+ high quality randomness for this, so regular libc srand/rand >+ is sufficient. */ >+ srand(time(NULL)*getpid()); >+ >+ for (i=0; i<srvcount; i++) { >+ int j; >+ float prio_count=0, chose; >+ >+ for (j=i; j<srvcount && list[i].prio==list[j].prio; j++) { >+ prio_count+=list[j].weight; >+ list[j].run_count=prio_count; >+ } >+ >+ chose=prio_count*rand()/RAND_MAX; >+ >+ for (j=i; j<srvcount && list[i].prio==list[j].prio; j++) { >+ if (chose<=list[j].run_count) { >+ /* Swap j with i */ >+ if (j!=i) { >+ struct ns_srv_reply temp; >+ >+ memcpy(&temp, &list[j], sizeof(struct ns_srv_reply)); >+ memcpy(&list[j], &list[i], sizeof(struct ns_srv_reply)); >+ memcpy(&list[i], &temp, sizeof(struct ns_srv_reply)); >+ } >+ break; >+ } >+ } >+ } >+ } >+ >+ /* TODO: bitlbee should expect a situation when more than one server >+ * is available for the given SRV record. >+ */ >+ reply = list; >+ //g_free(list); >+ list=NULL; >+#endif /* HAVE_RESOLV_A */ >+ return reply; >+ >+ noanswer: g_free(list); >+ list=NULL; >+ return NULL; >+ >+ fail: g_free(list); >+ list=NULL; >+ return NULL; >+} >+ >+#ifdef TEST >+int main(int argc, char *argv[]) { >+ struct ns_srv_reply *srv; >+ /*int rc,i;*/ >+ >+ srv=srv_lookup("xmpp-client", "tcp", "jabber.org"); >+ printf("priority=%hu\n", srv->prio); >+ printf("weight=%hu\n", srv->weight); >+ printf("port=%hu\n", srv->port); >+ printf("target=%s\n", srv->name); >+ printf("\n"); >+ g_free(srv); >+ >+ return 0; >+} >+#endif /* TEST */ >+ >+/* >+ Local Variables: >+ compile-command: "cc -DTEST -I.. -I../include -Wall -g -o srv srv.c -lresolv libutil.a" >+ End: >+ */ >diff --git a/lib/srv.h b/lib/srv.h >new file mode 100644 >index 0000000..35af753 >--- /dev/null >+++ b/lib/srv.h >@@ -0,0 +1,49 @@ >+/* srv.h >+ * Copyright (C) 2003, 2004 Free Software Foundation, Inc. >+ * >+ * This file is part of GNUPG. >+ * >+ * GNUPG is free software; you can redistribute it and/or modify >+ * it under the terms of the GNU General Public License as published by >+ * the Free Software Foundation; either version 3 of the License, or >+ * (at your option) any later version. >+ * >+ * GNUPG 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 General Public License for more details. >+ * >+ * You should have received a copy of the GNU General Public License >+ * along with this program; if not, see <http://www.gnu.org/licenses/>. >+ */ >+ >+#ifndef GNUPG_COMMON_SRV_H >+#define GNUPG_COMMON_SRV_H >+ >+#ifdef HAVE_RESOLV_A >+# ifdef _WIN32 >+# include <windows.h> >+# else >+# include <netinet/in.h> >+# include <arpa/nameser.h> >+# include <resolv.h> >+# endif /* !_WIN32 */ >+#endif /* USE_DNS_SRV */ >+ >+ >+#ifndef MAXDNAME >+#define MAXDNAME 1025 >+#endif >+ >+struct ns_srv_reply >+{ >+ int prio; /* priority */ >+ int weight; /* weight */ >+ int port; /* port */ >+ int run_count; /* from struct srventry at gnupg's common/srv.h */ >+ char name[MAXDNAME]; /* target */ >+}; >+ >+struct ns_srv_reply *srv_lookup(char *service, char *protocol, char *domain); >+ >+#endif /*GNUPG_COMMON_SRV_H*/
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 439047
: 302473