Kit Name: ALPACRT08_071 Kits superseded by this kit: ALPACRT07_071 Kit Dependencies: The following remedial kit(s) must be installed BEFORE installation of this, or any required kit, kit: ALPBASE02_071 In order to receive all the corrections listed in this kit, the following remedial kits should also be installed: None Kit Description: Version(s) of OpenVMS to which this kit may be applied: OpenVMS Alpha V7.1, V7.1-1H1, V7.1-1H2 Files patched or replaced: o [SYSLIB]DECC$SHR.EXE (new image) o [SYSLIB]CRTL.OBJ (new file, used to update STARLET.OLB) o [SYSLIB]CRTLMSGDEF.OBJ (new file, used to update STARLET.OLB) o [SYSUPD]ACRT$ECO_DROP.COM (new file) Problems addressed in ALPACRT08_071 kit o The previous kit, ALPACRT07_071, documented a requirement that the ALPY2K01_071 remedial kit must be installed first (before ALPACRT07_071). However, the Y2K kit is not needed, so it is NOT included as a requirement for this new ALPACRT08_071 kit. Page 2 Problems addressed in ALPACRT07_071 kit o For DEC C Run-Time Library (RTL) functions, a call with a too long filename argument could result in an access violation. o After installing the ALPY2K01_071 kit, for an existing file, the open() function failed with errno EEXIST, when called with the O_EXEC flag, but without the O_CREAT flag. Prior to the ALPACRT02_071 ECO kit, the behavior was as if the open function was replacing the O_EXCL flag with the O_CREAT flag, if the former was specified alone so that the function was successfully opening an existing file when called with a single O_EXCL flag. The current kit restores this behavior. o One could possibly specify none, one or both options for MAP_SHARED/MAP_PRIVATE and MAP_FIXED/MAP_VARIABLE. However, the documentation (in both cases) states that you must specify only one of each of these options and also just one of MAP_FILE/MAP_ANONYMOUS (defaults to MAP_FILE if not specified at all as it is represented by a single bit in the flags parameter). Furthermore, a call to the munmap() function to unmap a PRIVATE section modifies errno, even though success is returned by the function. o The functions from the exec family of functions no longer forced activation on-disk images. The regression was introduced in the ALPACRT03_071 kit and occurred regardless of how the image file was specified in the call to the exec function. The problem prevented activation of installed images, because the explicit file version in the file spec prevented image activator from known-file lookups. As the result of this problem, the child process was always running an on-disk version of the image. If the image that was supposed to be executed by the child process was installed with privileges, the child process would not get expected privileges and would fail while attempting to perform an operation which required privileges provided by the installed image. o The Chown function changed the owner of a file to [-1,-1], when passed with owner and group arguments of -1. o The DCL Pn (P1, P2, etc.) parameters passed to a DCL child were uppercased. o A performance problem with the %d, %o, %x, %u and %c printf format specifiers occurred. Consequently, after installing several ECO kits, a regular job was taking about twice the normal time to complete. o After installing the ALPACRT06_071 ECO kit, a performance problem in UTC-based time functions was introduced. An application detected roughly an order of magnitude increase in Page 3 elapsed time due to the decc$__utc_mktime CRTL function. This slowdown was attributed to the change done in thread local storage macros when these macros were made AST-safe. o Exec functions failed with the errno set to ENOEXEC (exec format error) when requested to activate a shareable image. The regression was introduced in ALPACRT03_071 and the problem happened on OpenVMS V7.1 or higher, when using the DEC C RTL backport object library. o The mmap function was enhanced to accept an optional integer argument specifying additional flags to be passed to the SYS$CRMPSC system service for a MAP_SHARED request. Applications making use of an additional argument must be compiled with DEC C Version 6.0 or higher. The new signature of the mmap function is as follows: void mmap (void *addr, size_t len, int prot, int flags, int filedes, off_t off); (X/OPEN, POSIX) void mmap (void *addr, size_t len, int prot, int flags, int filedes, off_t off ...); (DEC C EXTENSION) Using the optional argument, the caller can create, for example, a system global section (SEC$M_SYSGBL bit) or permanent global section (SEC$M_PERM bit). Here, to create a system permanent global section, the caller can specify (SEC$M_SYSGBL | SEC$M_PERM) in the optional argument. The mmap function does not check or set any privileges. The caller's responsibility is to set appropriate privileges, such as the SYSGBL privilege for SEC$M_SYSGBL and PRMGBL for SEC$M_PERM, before calling mmap with the optional argument. o The DECC$FIX_TIME function could return a meaningless value and the caller had no way to check whether the function succeeded or not. The DEC C RTL Manual shipped with the DEC C V6.0 compiler indicates that the DECC$FIX_TIME function may fail as follows: Return Values x A longword containing the number of seconds since 00:00 January 1, 1970. (unsigned int)(-1) Indicates an error. Be aware, that a return value of (unsigned int)(-1) can also represent a valid date of Sun Feb 7 06:28:15 2106. o A POW function call resulted in an %SYSTEM-F-HPARITH exception when called in a D_FLOAT floating point mode with the result maximum value representable in D_FLOAT format. Page 4 Problems addressed in ALPACRT06_071 kit o After upgrading a system from OpenVMS V6.2 to OpenVMS V7.1, there is an incompatible change in the record generation mechanism for a file with a FORTRAN carriage control, when used with "ctx=nocvt" and "mrs=132" and the data does not contain record terminators (line-feed characters). On OpenVMS V6.2, for such a file, the record is generated on each call to the C RTL output function regardless of whether the data contains record terminators or not. On OpenVMS V7.1, the C RTL accumulates the data until the maximum record size is reached and, then, writes everything as a single record. While the new behavior is in line with the description of processing RMS files in record mode in the DEC C Run-Time Library Reference Manual, for compatibility consideration a way to request the old behavior was provided. The behavior can be enabled by defining the logical name DECC$V62_RECORD_GENERATION (any equivalence string). o A new function facilitating validation of a wide character was implemented. The function has the following interface: int decc$validate_wchar(wchar_t wc); The decc$validate_wchar function returns 1 (one) if the specified wide character is a valid wide character in the current program's locale and zero otherwise. o lseek and fseek functions have been fixed to position a fixed-length record file to the last written byte when SEEK_END is specified. Prior to this, the functions were positioning such a file at the end of the last fixed-length record regardless of whether the last record contained a full amount of data or not. So that this correction does not break existing applications, the new behavior must be enabled by defining the logical name DECC$FIXED_LENGTH_SEEK_TO_EOF (any equivalence string). o Two new fcntl requests defined by X/Open and POSIX were implemented: #include #include #include int fcntl(int fildes, F_SETFD, FD_CLOEXEC); int fcntl(int fildes, F_GETFD); fcntl(fildes, F_SETFD, FD_CLOEXEC) sets the FD_CLOEXEC flag for specified file descriptor. If the FD_CLOEXEC flag is set, the file descriptor is not passed to a child process spawned by one of the exec functions. In other words, FD_CLOEXEC flag prevents normal inheritance of the open file descriptor by the child process. Page 5 fcntl(fildes, F_GETFD) returns flags associated with specified file descriptor. If FD_CLOEXEC flag was set, fcntl will return FD_CLOEXEC. o A customer reports that ioctl fails with "can't assign requested address" status when called with FIONREAD request code for a socket device. The cause of the failure is that FIONREAD macro is defined differently in header and header and underlying UCX routine expects the value from header. The ioctl function was fixed to call UCX routine with the value of FIONREAD presented in header. o A customer reports that the child process spawned by one of the functions from the exec family does not inherit the file offset and file append mode from the parent as required by X/Open specifications and the POSIX standard. To have this correction not break existing applications, the correct behavior of inheritance of the file offset and append mode by the child process must be enabled by defining the logical name DECC$EXEC_FILEATTR_INHERITANCE (any equivalence string) prior to the first call to any function from the exec family. Problems addressed in ALPACRT05_071 kit o The cache of values introduced in the getenv function caused regressions to occur in numerous applications. The default has been changed from using the cache to only using the cache when a specific logical is set. This new logical, DECC$ENABLE_GETENV_CACHE, should be set prior to invoking an application whose performance depends on using the getenv cache. The logical DECC$DISABLE_GETENV_CACHE is no longer used. o The CRTL uses the system default (DEFMBXMXMSG SYSGEN parameter) for the mailbox maximum message size (maxmsg) while creating a mailbox associated with the pipe. Before this change, the maxmsg was set to 512, the value documented in the description of the pipe function in the DEC C Run-Time Library Reference Manual for OpenVMS Systems. Since the read function transfers not more than maxmsg bytes from a pipe, this change broke applications relying on the 512 bytes limit. The errant code was introduced in the ECO named ALPACRT04_071. o Attempts to open a network mailbox to fail. o A correction was made to the rewind function which now works correctly for a file opened using the append access mode. o The fread function no longer access violates when passed stdin. This error only occurred when the stdin file descriptor was a socket descriptor inherited from a parent C process. Page 6 o The dup2 function would access violate when called with the second file descriptor larger than 256. o An ISV porting software to OpenVMS sought assistance in handling parameters being passed to the image when invoked as a foreign command. A new function has been added which gives an application control over how arguments to the image are obtained. The new function is specified as: int decc$$set_get_foreign(const char* image_name, const char* image_location, const char* routine_name) If this function is called prior to the C main program, the DEC C RTL will call this routine instead of LIB$GET_FOREIGN to obtain the parameters. o Performance improvements previously applied to only the sprintf function being called with a "%s" format specifier have now been made in all functions which use thread specific data. Applications which use DECthreads and the DEC C RTL may see significant performance improvements when calling functions which use thread specific data, such as those listed in section 1.7.1 of the reference manual. o Data inconsistencies occurred when the sprintf function was called by both an AST routine and the main program. o It was reported that the functions strtol, strtoul, wcstol, wcstoul, and the OpenVMS Alpha specific functions strtoq and strtouq do not consume the trailing digits after an overflow condition. This behavior is required by the ANSI standard. To have this correction not break existing applications, the correct behavior of consuming these characters must be enabled by defining the logical name DECC$STRTOL_ERANGE prior to the first call to any of these functions. Problems addressed in ALPACRT04_071 kit o The mmap function no longer fails if a file is opened with read access and the calling program has specified both the PROT_WRITE and MAP_PRIVATE flags. The correct behavior of using the MAP_PRIVATE flag is to disregard the access mode of the opened file. o The opendir function no longer fails if a file having the same name, but no extension, exists in the same directory as the directory being opened. Prior to this change, having an extensionless file in the same directory as the directory being opened would fail, even if the full name and extension was used in the opendir call. Page 7 o Changes made in OpenVMS V7.0 have affected the processing of files having "FORTRAN Carriage Control" record attributes. The following changes were introduced in OpenVMS V7.0 and are repaired in this ECO kit: o The DEC C RTL now prepends (instead of appends) linefeed characters to records with the single-space carriage control. This was the behavior prior to OpenVMS V7.0. Prefixing this type of record with linefeeds is what RMS requires and allows overprinting to work better than when the linefeed was appended. The only known problem with the new version is that the carriage-control character is not generated after the last file record. This problem will be fixed in the next release of CRTL." o A regression was introduced in the ALPACRT03_071 ECO kit such that calls to the stat function which use the "DNA=STRING" parameter access violate. Calls to fopen may also access violate when the fopen function calls stat to determine if the file exists. o A request was made that the sysconf function be enhanced to return information about the processors in a system. Specifically the _SC_NPROC_CONF (200) and _SC_NPROC_ONLN (201) options are now supported. Modifications to the UNISTD.H header file to define these constants will be made available in a future release of the DEC C compiler. It is recommended that application developers add the code #ifndef _SC_NPROC_CONF # define _SC_NPROC_CONF 200 # define _SC_NPROC_ONLN 201 #endif until these definitions are available. o A problem related to the size of an intermediate pipe buffer may lead to a write operation receiving a %SYSTEM-F-MBTOOSML. The size of the buffer has been corrected. o The access function would incorrectly examine the SYSTEM protection codes and use those codes in determining if access would be allowed. The access function required that all requested access modes be available in a single group of OpenVMS protection codes. The access modes may now be spread across protection code groups such as world, group, owner, and system. o A user reported that the sprintf function, when called using a simple "%s" format specifier performed worse in a threaded application than the equivalent call to strcpy. We have changed the processing of "%s" to perform in line with the strcpy function for this format specifier. Page 8 o Beginning in the ALPACRT03_071 and ALPY2K01_071 ECO kits, calling the getenv function for the "TERM" variable began returning the string "name-80" instead of correctly returning the terminal type such as "VT320-80". o Beginning in the ALPACRT03_071 remedial kit, the ioctl function defaults to using the software available as the UCX$IOCTL_ROUTINES example code. An error in the original code is that if an error were to occur, a system service status code (such as SS$_ACCVIO) would be returned as an errno value. This has been corrected to return either the corresponding errno value or EVMSERR with vaxc$errno being assigned this system service status code. Problems addressed in ALPACRT03_071 kit o Users have requested that kill support the POSIX semantics of "if the process ID is negative but not -1, the signal will be sent to all processes whose group ID is equal to the absolute value of the process ID, and for which the process has permission to send a signal." This has been added with the restrictions that the process is executing on the same node and does not have a SYSTEM UIC. The errno value is set to ESRCH if no processes are found which match the condition specified. o An enhancement was made in the DEC C V5.6 compiler to optimize certain format strings passed to the printf family of library functions. This ECO kit adds the runtime support to the shareable image. Prior to this, the symbols were resolved via objects added to STARLET by the compiler. Full details of this support can be found in the DEC C V5.6 release notes. o The performance of DEC C sprintf was much slower than VAX C. An analysis of the printf engine resulted in changes which brings DEC C within 10% of VAX C. o The functions fopen and freopen were mapping invalid access modes to read mode. Invalid modes now cause errno to be set to EINVAL and the open call to fail. o The times function was changed in OpenVMS V7.0 to return the number of clock ticks since boot time. Performing year 2000 testing by setting the system time forward causes this return value to overflow. The times function has been changed to return the number of clock ticks since login time, which is less likely to overflow. o The lseek function may position incorrectly with repeated calls to seek, in a file containing fixed length records of odd length. This problem does not occur with even length or variable length records. Page 9 o Mailbox devices are record oriented devices, except when created by the pipe function where they are opened as stream devices. Applications which use mailboxes can now force the library to treat all mailboxes as stream devices by creating an environment variable named DECC$MAILBOX_CTX_STM. o The runtime library has been corrected to treat UNIX directory specifications identically in each of the routines which accept a directory specification as a parameter. These runtime library functions are access, opendir, mkdir, and rmdir. Prior to this change, one could call opendir with "/dev/dir", but was forced to append ".dir" to this when calling the access function. o This ECO kit includes major performance improvements when using time related functions along with Universal Coordinated Time. o A cache of values has been added to the getenv function to avoid the library making repeated calls to translate a logical name or to obtain a symbol value for environment variables which are not set. If your application makes direct calls to set logical names, this caching can be disabled by defining DECC$DISABLE_GETENV_CACHE prior to calling any runtime library functions. o The ANSI standard states that streams opened in update mode may read and write to the stream. It further states that reads must be followed by file positioning prior to writing to the stream. The problem corrected was that positioning functions would fail when the file was a terminal. Applications may now position such streams back to the beginning using either rewind or seek. o It was reported that opendir overflowed the stack when running in a threaded application. While correcting this problem, the opendir successful return value was changed from one to zero to align with the X/Open Specifications. o A problem introduced in OpenVMS V7.1 causes the first record of a file to be overwritten when the file is opened in append mode. The correct behavior is that all write operations are done at the end of the file. o Porting code to OpenVMS is hampered by the difference between command procedures and executable images and the mechanisms necessary to invoke them. When passed the string "TEST", the exec functions now search for "TEST.","TEST.EXE", and "TEST.COM". If found, it is executed as either an image or a command procedure, depending on information in the file header. o Several new universals have been added to the DECC$SHR image shipped with this ECO kit. The presence of these universals may affect application developers who compile using this image. If a developer begins to get errors of the form %LINK-W-MULDEF, symbol DECC$XXX multiply defined in module DECC$SHR file SYS$COMMON:[SYSLIB]DECC$SHR.EXE;1 Page 10 while linking the application, the compile command should be modified to include "/PREFIX=EXCEPT=XXX". This instructs the compiler to exclude this function when doing name prefixing, which is equivalent to the behavior prior to this ECO kit. o The printf function was enhanced to print "(null)" when passed a null pointer to be used with the "%S" format specifier. Prior to this, the DEC C RTL would issue an access violation error. o Several functions were found to not accept the angle bracket form of directory specifications. These functions include decc$translate_vms and stat, which now accept either square brackets or angle brackets in the directory portion of file specifications. o The exec functions use a mailbox to coordinate open file information between the parent and child processes. A user reported their system hung after 1000 successful invocations of the same child process. This hang was caused by the parent process failing to release an exclusive mode lock being used to coordinate access to the mailbox. The hang would occur when a mailbox was assigned to the parent process for a second time. o A user reports calling ioctl sets errno to ENOSYS (Function not implemented). Beginning with OpenVMS V7.0, the library looks for support in the underlying TCPIP stack and sets this error if the support is not found. The function has been enhanced to execute UCX$EXAMPLES:UCX$IOCTL_ROUTINES under these conditions. o The decc$to_vms function has been enhanced to recognize names found on other systems, converting "/dev/null" to "NLA0:", "/tmp" to "SYS$SCRATCH:", and "/bin" to "SYS$SYSTEM:". o The getpwnam function now uppercases the username parameter if it is not found in its original form. Prior to this change, the function would fail. Problems addressed in ALPACRT02_071 kit o Those functions, such as printf, which have thread specific data incorrectly use the threads interface to release that memory when a thread is being destroyed. The result is that all thread specific memory is lost. o The read, fread, write, and fwrite DEC C RTL functions now return unsuccessful status with errno set to EINVAL if one of the arguments of size_t type or total number of bytes to be transmitted is not in the range 0 to INT_MAX. The total number of bytes is the product of the size_of_item and number_items arguments for fread and fwrite functions. The value of INT_MAX is defined in the header file. Page 11 o The interval timer function, setitimer, fails to reset itself when used in a multithreaded application. The result is a single firing of the timer as opposed to repeated firing of the timer at fixed intervals. o A change made in OpenVMS V7.1 and remedial kits to other versions cause calls to the mktemp function using templates of the form "dumpXXXXXX.txt" to no longer substitute the pattern with the process id. While a change is necessary to prohibit substituting the directory portion in a template such as "[XX]dumpXXXXXX", the change that was made was overly harsh, forcing all substitution to the end of the pattern. o The strstr function accesses memory beyond the ends of the strings passed. In cases where the next page is not accessible, the result is an access violation. The problem was reported against the ADA compiler, which uses the strstr function in this way. o Although files in general are correctly inherited after a fork/exec function call, files which are opened in any sort of sharing mode are not. o The ECO kits ALPACRT01_071 and VAXACRT01_071 made changes to the return value of the puts and fputs routines. While these changes were in line with the documentation, which states that they return non-negative numbers on success, specific applications were coded to expect zero as success. Since this zero return value was documented with the VAXC product, we have restored the original behavior. o When accessing files in stream mode, closing the file may result in an extra byte being written to the file. While this byte is not seen using the type command, it may be seen when using the dump utility. o A customer reports that the functions atof, strtod, and wcstod incorrectly return HUGE_VAL values when compiling with the IEEE_FLOAT and an ieee_mode qualifier of DENORM_RESULTS. The results returned have been modified to take the compilation mode of the calling program into account. The return value can now be compared against HUGE_VAL. o The following code segment demonstrates a problem in the printf family of functions running on OpenVMS for Alpha. double n; for (n = 9.0e16; n < 11.0e17; n += 1.0e+17) printf ("%20.0f\n", n); The result is that the final zero is missing in the display of all but the first and last line. Page 12 Problems addressed in ALPACRT01_071 kit o The stat function now uses a thread specific buffer to store data. Prior to this correction, calling stat from two separate threads would interfere with one another. o An ISV reports that extra characters are seen on occasion when using a subprocess which sends data back to the parent process using a mailbox. o A case was found where the fseek function failed, correctly returned a -1 value, but failed to set errno properly. o One of the arguments to the decc$to_vms function is "allow_wild" which is documented to accept the values zero and one. If wildcards are used in the file specification, they are either rejected or expanded into the resultant file specifications. Passing a value of -1 for the allow_wild parameter now returns the file specifications with the wildcards intact, but after having prepared to the point of doing a sys$search. o Unlike DIGITAL UNIX, the fsync(socket_id) call results in an access violation instead of returning an EINVAL status. o A user reports and demonstrates that opening and closing sockets does not properly release mutexes eventually causing this resource to be exhausted. This problem was introduced in OpenVMS V7.0. o Applications which call opendir and readdir recursively to traverse subdirectories may end up in an infinite loop when reading the directory which includes returning [000000]000000.DIR. The readdir function no longer returns an entry which is equivalent to the directory being read. o OpenVMS V7.1 changed the behavior of the readdir function in that it no longer retains the ".dir" extension when returning a directory using the UNIX file syntax. Applications which rely on this extension can now define a DECC$READDIR_KEEPDOTDIR logical to restore this behavior. o Beginning with OpenVMS V7.1, the DEC C Runtime Library does not read the first record while opening the file if such preloading will cause RMS to lock the record. Several users have reported that images which used to work fine now fail. We have tuned this record preloading code to take these user programs into account. Page 13 Kit Installation Rating: The following kit installation rating, based upon current CLD information, is provided to serve as a guide to which customers should apply this remedial kit. (Reference attached Disclaimer of Warranty and Limitation of Liability Statement) INSTALLATION RATING: 3 : To be installed by customers experiencing the problems corrected. Installation Instructions: Install this kit with the VMSINSTAL utility by logging into the SYSTEM account, and typing the following at the DCL prompt: @SYS$UPDATE:VMSINSTAL ALPACRT08_071 [location of the saveset] The saveset location may be a tape drive, or a disk directory that contains the kit saveset. Since the images in this kit will not take effect until the system is rebooted, you must reboot the system after installing this kit. If you have other nodes in your OpenVMS cluster, they must also be rebooted in order to make use of the new image(s). If it is not possible or convenient to reboot the entire cluster at this time, a rolling re-boot may be performed. During installation you may see the following message: %INSTALL-E-NODELSHRADR, unable to delete image with shareable address data -INSTALL-I-PLSREBOOT, please reboot to install a new version of this image This is not a cause for concern. It simply means that DECC$SHR.EXE was installed as a resident image, which is the standard configuration for OpenVMS Alpha V7.1 systems. The new image will not take effect until the system is rebooted. Removal Instructions: Remove this kit and restore the original files and libraries by logging into the SYSTEM account and typing the following DCL prompt: @SYS$UPDATE:ACRT$ECO_DROP NOTE: ACRT$ECO_DROP.COM INSTALLs the earlier version of DECC$SHR.EXE. However, the earlier version will not take effect until the system is rebooted. A reboot MUST be done as part of the removal process. Page 14 Otherwise, the system may be left in an inconsistant state. To remove the kit from an OpenVMS cluster node, the ACRT$ECO_DROP.COM file must be run and a reboot MUST be performed on any system disk upon which the kit was installed. Copyright (c) Compaq Computer Corporation, 1999 All Rights Reserved. Unpublished rights reserved under the copyright laws of the United States. The software contained on this media is proprietary to and embodies the confidential technology of Compaq Computer Corporation. Possession, use, or dissemination of the software and media is authorized only pursuant to a valid written license from Compaq Computer Corporation. DISCLAIMER OF WARRANTY AND LIMITATION OF LIABILITY THIS PATCH IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED TO THE EXTENT PERMITTED BY APPLICABLE LAW. IN NO EVENT WILL COMPAQ BE LIABLE FOR ANY LOST REVENUE OR PROFIT, OR FOR SPECIAL, INDIRECT, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, WITH RESPECT TO ANY PATCH MADE AVAILABLE HERE OR TO THE USE OF SUCH PATCH.