diff options
Diffstat (limited to 'server')
-rw-r--r-- | server/access.h | 4 | ||||
-rw-r--r-- | server/acl_files.c | 12 | ||||
-rw-r--r-- | server/bdump.c | 19 | ||||
-rw-r--r-- | server/dispatch.c | 33 | ||||
-rw-r--r-- | server/kstuff.c | 40 | ||||
-rw-r--r-- | server/main.c | 2 | ||||
-rw-r--r-- | server/realm.c | 25 | ||||
-rw-r--r-- | server/server.c | 2 | ||||
-rw-r--r-- | server/subscr.c | 16 | ||||
-rw-r--r-- | server/utf8proc.c | 2 | ||||
-rw-r--r-- | server/zserver.h | 62 | ||||
-rw-r--r-- | server/zstring.c | 7 |
12 files changed, 108 insertions, 116 deletions
diff --git a/server/access.h b/server/access.h index d9802d0..910770f 100644 --- a/server/access.h +++ b/server/access.h @@ -36,7 +36,3 @@ void access_reinit(void); /* found in acl_files.c */ int acl_load(char *); - -/* external data relevant */ -extern int zdebug; - diff --git a/server/acl_files.c b/server/acl_files.c index e62451a..e7bfc0c 100644 --- a/server/acl_files.c +++ b/server/acl_files.c @@ -60,8 +60,8 @@ static const char rcsid_acl_files_c[] = "$Id$"; /* If realm is missing, it becomes the local realm */ /* Canonicalized form is put in canon, which must be big enough to hold MAX_PRINCIPAL_SIZE characters */ -void acl_canonicalize_principal(char *principal, - char *canon) +static void +acl_canonicalize_principal(char *principal, char *canon) { char *end; char *dot, *atsign; @@ -240,7 +240,8 @@ add_host(struct host_ace **list, { struct host_ace *e; struct in_addr addr; - unsigned long mask = 0, i; + unsigned long mask = 0; + long i; char *m, *x; m = strchr(buf, '/'); @@ -395,7 +396,7 @@ acl_cache_reset(void) /* Returns nonzero if it can be determined that acl contains principal */ /* Principal is not canonicalized, and no wildcarding is done */ /* If neg is nonzero, we look for negative entries */ -int +static int acl_exact_match(char *acl, char *principal, int neg) @@ -412,7 +413,7 @@ acl_exact_match(char *acl, /* Returns nonzero if it can be determined that acl contains who */ /* If neg is nonzero, we look for negative entries */ -int +static int acl_host_match(char *acl, unsigned long who, int neg) @@ -442,7 +443,6 @@ acl_check(char *acl, char buf[MAX_PRINCIPAL_SIZE]; char canon[MAX_PRINCIPAL_SIZE]; char *instance, *realm; - unsigned long mask; int p, i, r, result = 0; if (principal) { diff --git a/server/bdump.c b/server/bdump.c index 9982271..c790d8f 100644 --- a/server/bdump.c +++ b/server/bdump.c @@ -411,7 +411,7 @@ bdump_send(void) (void) strcpy(instance, "*"); /* let Kerberos fill it in */ ticket.length = len; - memcpy(&ticket.dat, data, MIN(len, sizeof(ticket.dat))); + memcpy(&ticket.dat, data, MIN(len, (int)sizeof(ticket.dat))); retval = krb_rd_req(&ticket, SERVER_SERVICE, instance, from.sin_addr.s_addr, &kdata, srvtab_file); /* @@ -858,7 +858,8 @@ transmit_tcp(char *pack, int packlen) syslog(LOG_WARNING, "transmit_tcp: writing length: %m"); retval = errno; } else { - syslog(LOG_WARNING, "transmit_tcp: writing length: %d vs %d", sizeof(length), count); + syslog(LOG_WARNING, "transmit_tcp: writing length: %lu vs %d", + (unsigned long)sizeof(length), count); retval = ZSRV_LEN; } goto cleanup; @@ -1177,6 +1178,8 @@ bdump_recv_loop(Server *server) Client *client = NULL; struct sockaddr_in who; #ifdef HAVE_KRB5 + uint32_t client_enctype; + uint32_t client_keysize; unsigned char buf[512]; int blen; #endif @@ -1318,9 +1321,11 @@ bdump_recv_loop(Server *server) syslog(LOG_ERR,"bdump_recv_loop: bad keyblock read: %s (%s)", error_message(retval), cp); } else { + memcpy(&client_enctype, &buf[0], sizeof(uint32_t)); + memcpy(&client_keysize, &buf[4], sizeof(uint32_t)); retval = Z_krb5_init_keyblock(Z_krb5_ctx, - ntohl(*(krb5_enctype *)&buf[0]), - ntohl(*(uint32_t *)&buf[4]), + ntohl(client_enctype), + ntohl(client_keysize), &client->session_keyblock); if (retval) { syslog(LOG_ERR, "bdump_recv_loop: failed to allocate keyblock: %s", @@ -1533,12 +1538,12 @@ get_packet(char **packet, int *buflen, int *retlen) char *p; result = net_read(input, (char *) &length, sizeof(unsigned short)); - if (result < sizeof(short)) { + if (result < (int)sizeof(short)) { if (result < 0) { return errno; } else { - syslog(LOG_ERR, "get_packet: received length: %d vs %d (%m)", result, - sizeof(short)); + syslog(LOG_ERR, "get_packet: received length: %d vs %lu (%m)", + result, (unsigned long)sizeof(short)); return ZSRV_LEN; } } diff --git a/server/dispatch.c b/server/dispatch.c index eaacc2c..8b9507a 100644 --- a/server/dispatch.c +++ b/server/dispatch.c @@ -230,7 +230,6 @@ dispatch(ZNotice_t *notice, { Code_t status; String *notice_class; - struct sockaddr_in who2; int authflag; ZRealm *realm; char *cp; @@ -252,8 +251,6 @@ dispatch(ZNotice_t *notice, return; } - who2 = *who; - notice_class = make_string(notice->z_class,1); if (from_server) { @@ -681,12 +678,13 @@ xmit(ZNotice_t *notice, } /* now we've sent it, mark it as not ack'ed */ - if (!retval) + if (!retval) { nacked = (Unacked *) malloc(sizeof(Unacked)); - if (!nacked) { - /* no space: just punt */ - syslog(LOG_WARNING, "xmit nack malloc"); - retval = ENOMEM; + if (!nacked) { + /* no space: just punt */ + syslog(LOG_WARNING, "xmit nack malloc"); + retval = ENOMEM; + } } if (!retval) { @@ -777,7 +775,6 @@ clt_ack(ZNotice_t *notice, ZNotice_t acknotice; ZPacket_t ackpack; int packlen; - char *sent_name; Code_t retval; if (bdumping) { /* don't ack while dumping */ @@ -791,21 +788,17 @@ clt_ack(ZNotice_t *notice, switch (sent) { case SENT: acknotice.z_message = ZSRVACK_SENT; - sent_name = "sent"; break; case NOT_FOUND: acknotice.z_message = ZSRVACK_FAIL; acknotice.z_kind = SERVNAK; - sent_name = "fail"; break; case AUTH_FAILED: acknotice.z_kind = SERVNAK; acknotice.z_message = ZSRVACK_NOTSENT; - sent_name = "nak/not_sent"; break; case NOT_SENT: acknotice.z_message = ZSRVACK_NOTSENT; - sent_name = "not_sent"; break; default: abort (); @@ -892,7 +885,7 @@ hostm_dispatch(ZNotice_t *notice, Server *server) { char *opcode = notice->z_opcode; - int i, add = 0, remove = 0; + int i, add_it = 0, remove_it = 0; if (notice->z_kind == HMACK) { /* Ignore. */ @@ -908,23 +901,23 @@ hostm_dispatch(ZNotice_t *notice, if (server == me_server) { server_forward(notice, auth, who); ack(notice, who); - add = 1; + add_it = 1; } } else if (strcmp(opcode, HM_ATTACH) == 0) { if (server == me_server) { server_forward(notice, auth, who); ack(notice, who); - add = 1; + add_it = 1; } else { - remove = 1; + remove_it = 1; } } else if (strcmp(opcode, HM_DETACH) == 0) { - remove = 1; + remove_it = 1; } else { syslog(LOG_WARNING, "hm_dispatch: unknown opcode %s", opcode); } - if (add) { + if (add_it) { for (i = 0; i < num_hosts; i++) { if (hosts[i].s_addr == who->sin_addr.s_addr) break; @@ -945,7 +938,7 @@ hostm_dispatch(ZNotice_t *notice, } hosts[num_hosts++] = who->sin_addr; } - } else if (remove) { + } else if (remove_it) { for (i = 0; i < num_hosts; i++) { if (hosts[i].s_addr == who->sin_addr.s_addr) { memmove(&hosts[i], &hosts[i + 1], num_hosts - (i + 1)); diff --git a/server/kstuff.c b/server/kstuff.c index 290a1e4..e405734 100644 --- a/server/kstuff.c +++ b/server/kstuff.c @@ -45,7 +45,7 @@ GetKerberosData(int fd, /* file descr. to read from */ { char p[20]; KTEXT_ST ticket; /* will get Kerberos ticket from client */ - int i; + unsigned int i; char instance[INST_SZ]; /* @@ -105,8 +105,8 @@ SendKerberosData(int fd, /* file descriptor to write onto */ { int rem; char p[32]; - int written; - int size_to_write; + size_t written; + size_t size_to_write; rem = krb_mk_req(ticket, service, host, (char *)ZGetRealm(), (u_long) 0); if (rem != KSUCCESS) @@ -115,10 +115,10 @@ SendKerberosData(int fd, /* file descriptor to write onto */ (void) sprintf(p,"%d ",ticket->length); size_to_write = strlen (p); if ((written = write(fd, p, size_to_write)) != size_to_write) - return (written < 0) ? errno : ZSRV_PKSHORT; + return ((ssize_t)written < 0) ? errno : ZSRV_PKSHORT; if ((written = write(fd, ticket->dat, ticket->length)) != ticket->length) - return (written < 0) ? errno : ZSRV_PKSHORT; + return ((ssize_t)written < 0) ? errno : ZSRV_PKSHORT; return 0; } @@ -190,7 +190,7 @@ ReadKerberosData(int fd, int *size, char **data, int *proto) { Code_t GetKrb5Data(int fd, krb5_data *data) { char p[20]; - int i; + unsigned int i; char *dst; for (i=0; i<20; i++) { @@ -229,12 +229,12 @@ GetKrb5Data(int fd, krb5_data *data) { Code_t SendKrb5Data(int fd, krb5_data *data) { char p[32]; - int written, size_to_write; - sprintf(p, "V5-%d ", data->length); + size_t written, size_to_write; + sprintf(p, "V5-%lu ", (unsigned long)data->length); size_to_write = strlen (p); if (size_to_write != (written = write(fd, p, size_to_write)) || data->length != (written = write(fd, data->data, data->length))) { - return (written < 0) ? errno : ZSRV_PKSHORT; + return ((ssize_t)written < 0) ? errno : ZSRV_PKSHORT; } return 0; } @@ -262,9 +262,9 @@ ZCheckSrvAuthentication(ZNotice_t *notice, int valid; char *cksum0_base, *cksum1_base = NULL, *cksum2_base; char *x; - unsigned char *asn1_data, *key_data; + unsigned char *asn1_data, *key_data, *cksum_data; int asn1_len, key_len, cksum0_len = 0, cksum1_len = 0, cksum2_len = 0; - krb5_flags acflags; + KRB5_AUTH_CON_FLAGS_TYPE acflags; #ifdef KRB5_AUTH_CON_GETAUTHENTICATOR_TAKES_DOUBLE_POINTER krb5_authenticator *authenticator; #define KRB5AUTHENT authenticator @@ -511,9 +511,9 @@ ZCheckSrvAuthentication(ZNotice_t *notice, /*XXX we may wish to ditch this code someday?*/ if ((!notice->z_ascii_checksum || *notice->z_ascii_checksum != 'Z') && key_len == 8 && - (enctype == ENCTYPE_DES_CBC_CRC || - enctype == ENCTYPE_DES_CBC_MD4 || - enctype == ENCTYPE_DES_CBC_MD5)) { + (enctype == (krb5_enctype)ENCTYPE_DES_CBC_CRC || + enctype == (krb5_enctype)ENCTYPE_DES_CBC_MD4 || + enctype == (krb5_enctype)ENCTYPE_DES_CBC_MD5)) { /* try old-format checksum (covers cksum0 only) */ ZChecksum_t our_checksum; @@ -548,10 +548,11 @@ ZCheckSrvAuthentication(ZNotice_t *notice, } /* HOLDING: authctx, authenticator, cksumbuf.data */ - memcpy(cksumbuf.data, cksum0_base, cksum0_len); + cksum_data = (unsigned char *)cksumbuf.data; + memcpy(cksum_data, cksum0_base, cksum0_len); if (cksum1_len) - memcpy(cksumbuf.data + cksum0_len, cksum1_base, cksum1_len); - memcpy(cksumbuf.data + cksum0_len + cksum1_len, + memcpy(cksum_data + cksum0_len, cksum1_base, cksum1_len); + memcpy(cksum_data + cksum0_len + cksum1_len, cksum2_base, cksum2_len); /* decode zcoded checksum */ @@ -685,10 +686,9 @@ static ZChecksum_t compute_rlm_checksum(ZNotice_t *notice, unsigned char *session_key) { ZChecksum_t checksum; - char *cstart, *cend, *hstart = notice->z_packet; + char *cstart, *hstart = notice->z_packet; cstart = notice->z_default_format + strlen(notice->z_default_format) + 1; - cend = cstart + strlen(cstart) + 1; checksum = z_quad_cksum((unsigned char *)hstart, NULL, cstart - hstart, 0, session_key); @@ -734,7 +734,7 @@ ZSetSession(krb5_keyblock *keyblock) { } if (result) /*XXX we're out of memory? */ - ; + return; } #endif #ifdef HAVE_KRB4 diff --git a/server/main.c b/server/main.c index ee4cc18..6cab996 100644 --- a/server/main.c +++ b/server/main.c @@ -151,8 +151,6 @@ main(int argc, struct sigaction action; #endif int optchar; /* option processing */ - extern char *optarg; - extern int optind; sprintf(list_file, "%s/zephyr/%s", SYSCONFDIR, SERVER_LIST_FILE); #ifdef HAVE_KRB4 diff --git a/server/realm.c b/server/realm.c index aef23c5..858a397 100644 --- a/server/realm.c +++ b/server/realm.c @@ -144,7 +144,7 @@ kill_realm_pids(void) return; } -ZRealmname * +static ZRealmname * get_realm_lists(char *file) { ZRealmname *rlm_list, *rlm; @@ -277,18 +277,6 @@ realm_sender_in_realm(const char *realm, char *sender) return 0; } -int sender_in_realm(ZNotice_t *notice) -{ - char *realm; - - realm = strchr(notice->z_sender, '@'); - - if (!realm || !strcmp(realm + 1, ZGetRealm())) - return 1; - - return 0; -} - ZRealm * realm_which_realm(struct sockaddr_in *who) { @@ -471,11 +459,11 @@ realm_init(void) int ii, jj, found; struct in_addr *addresses; struct hostent *hp; - char list_file[128]; + char realm_list_file[128]; char rlmprinc[MAX_PRINCIPAL_SIZE]; - sprintf(list_file, "%s/zephyr/%s", SYSCONFDIR, REALM_LIST_FILE); - rlmnames = get_realm_lists(list_file); + sprintf(realm_list_file, "%s/zephyr/%s", SYSCONFDIR, REALM_LIST_FILE); + rlmnames = get_realm_lists(realm_list_file); if (!rlmnames) { zdbug((LOG_DEBUG, "No other realms")); nrealms = 0; @@ -1035,9 +1023,10 @@ rlm_rexmit(void *arg) nackpacket->timer = timer_set_rel(rexmit_times[nackpacket->rexmits%NUM_REXMIT_TIMES], rlm_rexmit, nackpacket); - if (rexmit_times[nackpacket->rexmits%NUM_REXMIT_TIMES] == -1) + if (rexmit_times[nackpacket->rexmits%NUM_REXMIT_TIMES] == -1) { zdbug((LOG_DEBUG, "rlm_rexmit(%s): would send at -1 to %s", realm->name, inet_ntoa((realm->addrs[realm->idx]).sin_addr))); + } return; } @@ -1142,7 +1131,7 @@ realm_sendit_auth(ZNotice_t *notice, */ if (!retval && - ((notice->z_message_len+hdrlen > sizeof(ZPacket_t)) || + ((notice->z_message_len+hdrlen > (int)sizeof(ZPacket_t)) || (notice->z_message_len+hdrlen > Z_MAXPKTLEN))) { /* Reallocate buffers inside the refragmenter */ diff --git a/server/server.c b/server/server.c index b393f64..40551bc 100644 --- a/server/server.c +++ b/server/server.c @@ -446,7 +446,7 @@ server_timo(void *arg) auth = 0; break; default: - syslog(LOG_ERR,"Bad server state, server 0x%p\n", which); + syslog(LOG_ERR,"Bad server state, server 0x%p\n", (void *)which); abort(); } /* now he's either TARDY, STARTING, or DEAD diff --git a/server/subscr.c b/server/subscr.c index d276958..b788663 100644 --- a/server/subscr.c +++ b/server/subscr.c @@ -20,6 +20,10 @@ static const char rcsid_subscr_c[] = "$Id$"; #endif #endif +#ifndef INADDR_NONE +#define INADDR_NONE 0xffffffff +#endif + /* * The subscription manager. * @@ -347,7 +351,6 @@ subscr_realm_cancel(struct sockaddr_in *sin, ZRealm *realm) { Destlist *cancel_subs, *subs, *client_subs, *next, *next2; - Code_t retval; int found = 0; if (!realm) @@ -366,7 +369,7 @@ subscr_realm_cancel(struct sockaddr_in *sin, next2 = client_subs->next; if (ZDest_eq(&client_subs->dest, &subs->dest)) { Destlist_delete(client_subs); - retval = triplet_deregister(realm->client, &client_subs->dest, realm); + triplet_deregister(realm->client, &client_subs->dest, realm); free_subscription(client_subs); found = 1; break; @@ -1235,19 +1238,24 @@ Code_t subscr_foreign_user(ZNotice_t *notice, Client *client; ZNotice_t snotice; struct sockaddr_in newwho; - char *cp, *tp0, *tp1; + char *cp, *tp0; +#ifdef DEBUG + char *tp1; +#endif char rlm_recipient[REALM_SZ + 1]; tp0 = cp = notice->z_message; newwho.sin_addr.s_addr = inet_addr(cp); - if (newwho.sin_addr.s_addr == -1) { + if (newwho.sin_addr.s_addr == INADDR_NONE) { syslog(LOG_ERR, "malformed addr from %s", notice->z_sender); return(ZERR_NONE); } I_ADVANCE(0); +#ifdef DEBUG tp1 = cp; +#endif snotice = *notice; diff --git a/server/utf8proc.c b/server/utf8proc.c index 1c02241..40530b9 100644 --- a/server/utf8proc.c +++ b/server/utf8proc.c @@ -385,7 +385,7 @@ ssize_t utf8proc_decompose( if (decomp_result < 0) return decomp_result; wpos += decomp_result; // prohibiting integer overflows due to too long strings: - if (wpos < 0 || wpos > SSIZE_MAX/sizeof(int32_t)/2) + if (wpos < 0 || wpos > (ssize_t)(SSIZE_MAX/sizeof(int32_t)/2)) return UTF8PROC_ERROR_OVERFLOW; } } diff --git a/server/zserver.h b/server/zserver.h index 874b11a..cb36749 100644 --- a/server/zserver.h +++ b/server/zserver.h @@ -64,6 +64,27 @@ typedef struct { } Sched; #endif +enum _ZRealm_state { + REALM_UP, /* ZRealm is up */ + REALM_TARDY, /* ZRealm due for a hello XXX */ + REALM_DEAD, /* ZRealm is considered dead */ + REALM_STARTING /* ZRealm is between dead and up */ +}; + +enum _Server_state { + SERV_UP, /* Server is up */ + SERV_TARDY, /* Server due for a hello */ + SERV_DEAD, /* Server is considered dead */ + SERV_STARTING /* Server is between dead and up */ +}; + +enum _Sent_type { + NOT_SENT, /* message was not xmitted */ + SENT, /* message was xmitted */ + AUTH_FAILED, /* authentication failed */ + NOT_FOUND /* user not found for uloc */ +}; + typedef struct _Destination Destination; typedef struct _Destlist Destlist; typedef struct _ZRealm ZRealm; @@ -89,13 +110,6 @@ struct _Destlist { struct _Destlist *next, **prev_p; }; -enum _ZRealm_state { - REALM_UP, /* ZRealm is up */ - REALM_TARDY, /* ZRealm due for a hello XXX */ - REALM_DEAD, /* ZRealm is considered dead */ - REALM_STARTING /* ZRealm is between dead and up */ -}; - struct _ZRealm { char name[REALM_SZ]; int count; @@ -141,13 +155,6 @@ struct _Triplet { struct _Triplet *next, **prev_p; }; -enum _Server_state { - SERV_UP, /* Server is up */ - SERV_TARDY, /* Server due for a hello */ - SERV_DEAD, /* Server is considered dead */ - SERV_STARTING /* Server is between dead and up */ -}; - struct _Unacked { Timer *timer; /* timer for retransmit */ Client *client; /* responsible client, or NULL */ @@ -188,13 +195,6 @@ struct _Server { char addr_str[16]; /* text version of address */ }; -enum _Sent_type { - NOT_SENT, /* message was not xmitted */ - SENT, /* message was xmitted */ - AUTH_FAILED, /* authentication failed */ - NOT_FOUND /* user not found for uloc */ -}; - /* statistics gathering */ struct _Statistic { int val; @@ -226,14 +226,14 @@ struct _Statistic { if((elem)->next) (elem)->next->prev_p = (elem)->prev_p; \ } -MAKE_LIST_INSERT(Destlist); -MAKE_LIST_DELETE(Destlist); -MAKE_LIST_INSERT(Client); -MAKE_LIST_DELETE(Client); -MAKE_LIST_INSERT(Triplet); -MAKE_LIST_DELETE(Triplet); -MAKE_LIST_INSERT(Unacked); -MAKE_LIST_DELETE(Unacked); +MAKE_LIST_INSERT(Destlist) +MAKE_LIST_DELETE(Destlist) +MAKE_LIST_INSERT(Client) +MAKE_LIST_DELETE(Client) +MAKE_LIST_INSERT(Triplet) +MAKE_LIST_DELETE(Triplet) +MAKE_LIST_INSERT(Unacked) +MAKE_LIST_DELETE(Unacked) /* found in bdump.c */ void bdump_get(ZNotice_t *notice, int auth, struct sockaddr_in *who, @@ -339,6 +339,7 @@ void subscr_reset(void); Code_t subscr_def_subs(Client *who); Code_t subscr_realm(ZRealm *, ZNotice_t *); Code_t subscr_send_realm_subs(ZRealm *); +Code_t subscr_realm_subs(ZRealm *); Code_t subscr_realm_cancel(struct sockaddr_in *, ZNotice_t *, ZRealm *); /* found in uloc.c */ @@ -411,7 +412,7 @@ extern char subs_file[]; extern const char version[]; extern u_long npackets; /* num of packets processed */ extern time_t uptime; /* time we started */ -extern struct in_addr my_addr; +extern struct in_addr my_addr; /* my inet address */ extern struct timeval t_local; /* current time */ /* found in bdump.c */ @@ -435,7 +436,6 @@ extern String *wildcard_instance; extern ZRealm *otherrealms; extern int nrealms; -extern struct in_addr my_addr; /* my inet address */ #define class_is_control(classname) (classname == class_control) #define class_is_admin(classname) (classname == class_admin) diff --git a/server/zstring.c b/server/zstring.c index 8ae9ade..e7d0820 100644 --- a/server/zstring.c +++ b/server/zstring.c @@ -22,7 +22,8 @@ static const char rcsid_zstring_c[] = static String *zhash[STRING_HASH_TABLE_SIZE]; -int valid_utf8_p(const char* s) +static int +valid_utf8_p(const char* s) { ssize_t len; int32_t uc; @@ -38,16 +39,18 @@ int valid_utf8_p(const char* s) static char *zdowncase(const char* s) { + unsigned char *new_s_u; /* Avoid strict aliasing violation */ char *new_s, *p; if (valid_utf8_p(s)) { /* Use utf8proc if we're dealing with UTF-8. * Rather than downcase, casefold and normalize to NFKC. */ - utf8proc_map((const unsigned char *)s, 0, (unsigned char **)&new_s, + utf8proc_map((const unsigned char *)s, 0, (unsigned char **)&new_s_u, UTF8PROC_NULLTERM | UTF8PROC_STABLE | UTF8PROC_CASEFOLD | UTF8PROC_COMPAT | UTF8PROC_COMPOSE); + new_s = (char *)new_s_u; } else { /* If not, fall back to old methods. */ new_s = strsave(s); |