ECO NUMBER: VMS721_ACRTL-V0200 PRODUCT: OpenVMS Alpha OPERATING SYSTEM 7.2-1, 72-1H1 UPDATE PRODUCT: OpenVMS Alpha OPERATING SYSTEM 7.2-1, 72-1H1 COVER LETTER 1 KIT NAME: VMS721_ACRTL-V0200 2 KITS SUPERSEDED BY THIS KIT: VMS721_ACRTL-V0100 3 KIT DEPENDENCIES: 3.1 The following remedial kit(s) must be installed BEFORE installation of this, or any required kit: o VSM721_UPDATE-V0100 o VSM721_PCSI-V0100 3.2 In order to receive all the corrections listed in this kit, the following remedial kits should also be installed: None. 4 KIT DESCRIPTION: 4.1 Version(s) of OpenVMS to which this kit may be applied: OpenVMS Alpha V7.2-1, V7.2-1H1 4.2 Files patched or replaced: o [SYSLIB]DECC$SHR.EXE (new image) o [SYSLIB]CRTL.OBJ (new file - used to update STARLET.OBJ) o [SYSLIB]CRTLMSGDEF.OBJ (new file - used to update STARLET.OBJ) 5 PROBLEMS ADDRESSED IN KIT VMS721_ACRTL-V0200 o The Compaq C RTL functions which make calls to RMS have been modified to better support ODS-5 disks. This is an extensive set of changes throughout the RTL to support case preservation, long file names, and non-standard file name characters. The -- COVER LETTER -- Page 2 11 August 2000 default behavior of the RTL has not changed. The Compaq C RTL supports case preservation in file names on ODS level 5 disks. This applies when creating or reporting file names. By default, this feature is disabled. To enable this feature define the logical name DECC$EFS_CASE_PRESERVE to "ENABLE". If file names are all in upper case, define DECC$EFS_CASE_SPECIAL to "ENABLE" to convert the names into lower case when reporting the name in UNIX style. If file names are not all in upper case, then the case is preserved. Most C RTL functions now accept long OpenVMS-style file names as arguments. For OpenVMS Alpha Version 7.2, some basic Compaq C RTL I/O functions (creat, stat, and the functions from the open family of functions) were enhanced to accept long OpenVMS-style file names for an ODS-5 device. In this ECO kit, all other Compaq C RTL functions, except chdir and the functions from the exec family of functions, were also enhanced to accept long OpenVMS-style file names for an ODS-5 device. All C RTL functions that accept or report full file specifications will process file specifications up to 4095 bytes long, subject to the rules defined for the media format. For file specifications in OpenVMS format, there are no special restrictions. In situations where a full file specification cannot be reported because the buffer is too short, the function attempts to report the abbreviated name. There are restrictions with UNIX file names. Names containing special characters, such as multiple periods, caret, or multinational characters, may be rejected. A function call may report failure if the output buffer is not large enough to receive the full name. For OpenVMS-style names, the reported name would contain a FID-abbreviated name. There is no representation of FID-abbreviated names defined for UNIX. o The Compaq C RTL was enhanced to allow interpreting the leading part of a UNIX-style file specification as either a subdirectory name or a device name. The translation of the UNIX-style file name "foo/bar" to the OpenVMS-style file name "foo:bar" was the only translation in previous versions OpenVMS. It remains the default. To request translation of the UNIX-style name "foo/bar" to the OpenVMS-style name "[.foo]bar", DEFINE the following logical name to any value: $ DEFINE DECC$DISABLE_TO_VMS_LOGNAME_TRANSLATION ENABLE To return to the default file-name translation, DEASSIGN the logical name. The logical name is checked only once per image activation, not on a file-by-file basis. -- COVER LETTER -- Page 3 11 August 2000 o The file creation functions (fopen, open, creat) have been corrected to not inherit file attributes if a directory by the same name exists for the file being created. For example, creating a file named "foo." in a directory which contained a "foo.dir" would incorrectly inherit file attributes from this directory file. o The stat function no longer puts the wrong values into st_?time members of the stat structure. More precisely, during daylight savings time the values of st_?time are no longer one hour ahead from file creation/modification time reported by the $DIRECTORY command. o Nonquoted command-line arguments passed to C and C++ programs (argv arguments) can now optionally have their case preserved, rather than being lowercased as in previous versions. By default, this feature is disabled. To enable this case preservation feature, define the logical name DECC$ARGV_PARSE_STYLE to "ENABLE" and set the process-level DCL parse style flag to "EXTENDED" in the process running the program. Enabling this feature also ensures that the image name returned in argv[0] is also case-preserved. o The time functions time, ftime, gettimeofday and getclock would fail for a TDF (time differential factor) of -13 hours, the value required in New Zealand. According to the U.S. Naval Observatory information the valid range for the TDF is -13.75 to +13, inclusive. The C RTL now allows this full range. o The _malloc64 function was corrected to allow initialization of this function in a threadsafe manner. Prior to this change, if the first call occurs after the program has created multiple threads and more than one thread calls the _malloc64 routine, an access violation may occur. o In the previous ECO kit, a change was introduced to the function strptime() for XPG5-compatibility to handle expressions for the 2-digit year format %y when the century was not specified. The requirement is for 2-digit years in the range 0-68 to be treated as 21st century and years in the range 69-99 as 20th century. The 2-digit years in the range 69-99 were incorrectly being treated as 21st century. o The execlp and execvp functions were unconditionally prefixing the file specification of the image to be run in the child process with "VAXC$PATH:" string. When passed a fully qualified file specification, this would result in an invalid file specification. o The behavior of lseek() and fseek() at positions beyond the end of data in a file were not conforming to the POSIX/ANSI standard. The file was being physically null padded on disk even though the standard only requires this null padding if data is actually written at this point. In the case reported by the user, seeking to the end of a file by using a large -- COVER LETTER -- Page 4 11 August 2000 offset would take a long time and may exhaust available disk space. To get the POSIX behavior, you must define DECC$POSIX_SEEK_STREAM_FILE as "ENABLE". The default behavior is unchanged. o The Compaq C RTL was enhanced to open all files for shared access as if the "shr=del,get,put,upd" option was specified in the open* or creat call. To enable this feature, define the logical name DECC$FILE_SHARING to the value "ENABLE". The value is case-insensitive and is checked only once per image activation, not on a file-by-file basis. o The Compaq C RTL was failing when the amount of data written to a pipe exceeded the buffer size of that pipe. The RTL now breaks the large write into a sequence of writes whose size is the size of the underlying mailbox used to implement pipes. o The opendir function now accepts ".." to be equivalent to both "../" and "[-]". o A problem was reported that the RTL could hang if exit were called while threads were continuing to do I/O. Analysis showed that the hang was caused by a thread holding the lock necessary to close the file and the exit handler blocking on this lock. The change implemented was to not attempt to close files whose locks were currently in use. o When a stream file is extended using ftruncate() it is documented that the extended area will be filled with zeroes. This is now done correctly. Prior to this change, the file was not extended. o The documentation of the select function states that it returns either when a socket is ready to be read or written, when the timeout period expires, or when exceptions occur. It was not properly terminating when an exception occurred. This problem was corrected by dynamically linking to and calling an abort function in the socket library. A complete correction to interrupting the select function will also require an eco kit from the Compaq TCP/IP product which includes this new abort function. o The fstat function was corrected to not access violate when called with stdin, stdout, stderr, or a directory specification. o The chdir function was not well behaved when the calling program passed an argument which was a search list logical. The chdir function was unconditionally changing the logical sys$disk to the first member of the search list was effectively dropping the remaining members. The change in behavior is seen as a step in the right direction, but there are plans for more work in this area. -- COVER LETTER -- Page 5 11 August 2000 o The stat functions were not correctly handling files which were not directories but did use a .dir extension. This problem was discovered when porting a unix application which used a .dir extension to store application specific information. o The RTL functions which process file specifications were not correctly processing files which contained a hyphen character. The RTL was incorrectly assuming that hyphens were only allowed to specify a relative directory path. 6 PROBLEMS ADDRESSED IN KIT VMS721_ACRT-V0100 o The getenv() function has been corrected to check for a CLI symbol only when called in user access mode. While DEC C RTL is a user-mode run time library, we decided to correct getenv() in order to make the library more robust. This is because calling CLI from within exec or kernel mode may result in an access violation. With this fix, when called from inner access mode, the getenv() function will search only the C environment list and VMS logical names. This fix does not mean, however, that the user-mode only restriction was lifted. It is still unsupported to call the DEC C RTL functions, including getenv(), in any access mode other than in user-mode. o The strptime() function has been modified to comply with X/Open CAE Specification System Interfaces and Headers Issue 5 (commonly known as XPG5). In XPG5, it was changed how the strptime() function processes the "%y" directive for a two-digit year within the century if no century is specified. According to XPG5, for the "%y" directive when a century is not otherwise specified, values in the range 69-99 refer to years in the twentieth century (1969 to 1999 inclusive) while values in the range 00-68 refer to years in the twenty-first century (2000 to 2068 inclusive). Essentially, for the "%y" directive, strptime() became a "pivoting" function with 69 being a pivoting year. Before this change, the strptime() function was always interpreting two-digit year with no century as a year within the twentieth century. With the current ECO kit, XPG5-compliant strptime() becomes a default strptime() function in the DEC C RTL. However, for compatibility reasons, the previous "non-pivoting" XPG4-compliant strptime() function was retained. -- COVER LETTER -- Page 6 11 August 2000 The "pivoting" is controlled by the DECC$XPG4_STRPTIME logical name. Defining this logical name prior to invoking the application (any equivalence string) will cause the DEC C RTL to use the "non-pivoting" flavor of strptime(). Also "non-pivoting" strptime() can be called directly as decc$strptime_xpg4() function. While there is an easy way to disable "pivoting" by just defining a logical name, you should be aware that if the application ceases to work correctly due to the change in the strptime() function, it almost certainly means, that there is a Y2K problem in the application. Y2K-safe applications should not be affected by the change in strptime(). o The stat() function has been corrected to process file specifications such as "foo:[000000]" where foo is defined as a concealed device like the following: $ define/trans=(conc) foo device:[bar.] Prior to this fix, the stat() function would fail for such a file specification with errno set to ENOENT (No such file or directory). o Both flavors of system() function were corrected to ensure that the function always returns the correct status. The POSIX-compliant system() function has been corrected to always return status corresponding to the signal which terminated the child process if the child process was terminated due to receiving a signal. Prior to this fix, there was a small timing window when the function could return the status corresponding to the child process completion code even in the case when the child process was terminated by a signal. The Non-POSIX system() function has been corrected to always return the VMS completion code of the child process. Prior to this fix, there was a small timing window when the function could return the status from LIB$SPAWN() instead of the completion code of the child process. None of these problems were ever reported by a customer. o opendir() and readdir() functions have been corrected to process directories on a remote node specified using the following DECnet file specification: nodename"username password"::device:[directory] Prior to this fix, opendir() could fail with errno set to ENOTDIR (Not a directory). In the case when opendir() could successfully open the directory, readdir() function could return incorrect file names. -- COVER LETTER -- Page 7 11 August 2000 o times() and clock() functions have been modified to be both thread-safe and AST-reentrant. Prior to this change, these functions belonged to the class of functions which are thread safe, but not AST-reentrant (see section 1.7.2 Multithread Restrictions in the DEC C RTL Reference Manual). The change in the reentrancy status of the times() and clock() functions will be reflected in the next release of the Manual. o The stat() function no longer fails due to the failure of the mktime() function. It was reported that the stat() function fails for a file created on April 4th 1999 at 2:04 a.m. EST which is the "missing hour" in the transition from standard to daylight saving time in Eastern time zone. The failure was due to the failure of the mktime() function to process the "missing hour" (stat() calls mktime() to fill st_?time members of the stat structure with UTC time). While the mktime() function was not fixed, the stat() function was corrected to handle the failure of mktime() and set st_?time fields correctly even if mktime() fails. Note, that, strictly speaking, "missing hour" is an invalid input for mktime(): there is no such time as "April 4th 1999 2:04 a.m.", for example, in Eastern time zone. Given the possibility of calling mktime() with invalid time, the stat() function, probably, should not have used mktime() in the first place or at least should have been prepared for mktime() failure. o The CRTL I/O subsystem was enhanced to lift eight nested directory levels restriction for an ODS-5 device. It affects such DEC C RTL functions as access, mkdir, opendir, rmdir, and stat. The following program example shows different VMS and Unix-style deep directory specifications. #include #include #include #include #include #include #define DIM(_s) (sizeof(_s) / sizeof(_s[0])) /* ** we assume presence of root$ concieled device: ** ** define/NoLog/Tran=(Conceal,Terminal) root$ node$dka0:[000000.] -- COVER LETTER -- Page 8 11 August 2000 ** */ static char *filename[] = { "node$dka0:[w.x.y.z.a.b.c.d.e.f.g.h.i.j]", /* (1) */ "node$dka0:[w.x.y.z.a.b.c.d.e.f.g.h.i]j.dir", /* (2) */ "root$/w/x/y/z/a/b/c/d/e/f/g/h/i/j", /* (3) */ }; main() { struct stat s; int i; char *name; for(i=0; i < DIM(filename); ++i) { name = filename[i]; if ( mkdir(name,0) == -1 ) printf("%d? mkdir(): %s\n", i+1, strerror(errno)); if ( stat(name,&s) ) printf("%d? stat(): %s\n", i+1, strerror(errno)); else if ( !S_ISDIR(s.st_mode) ) printf("%d? stat(): %s\n", i+1, "not a directory???"); if ( !opendir(name) ) printf("%d? opendir(): %s\n", i+1, strerror(errno)); if ( access(name,F_OK) == -1 ) printf("%d? access(): %s\n", i+1, strerror(errno)); if ( rmdir(name) == -1 ) printf("%d? rmdir(): %s\n", i+1, strerror(errno)); } } Please note, that the DEC C RTL still does not support mixed Unix/VMS-style file names coded using extended ODS-5 syntax like "doc/foo.bar.bar", "~foo^.bar" and "./tmp/foo.bar.b^_ar". o The select() function has been corrected to return failure status if either invalid file descriptor or file descriptor not associated with a socket is found in one of the specified file descriptor sets. In case of invalid file descriptor, the select() function sets errno to EBADF. In case of a file descriptor not associated with a socket, the function sets errno to ENOTSOCK. Failure with errno set to EBADF is the standard requirement for the select() function. Failure with errno set to ENOTSOCK is because currently the select() function can operate only on sockets. -- COVER LETTER -- Page 9 11 August 2000 Prior to this fix, the function was setting errno as described above, but otherwise was ignoring invalid file descriptors and file descriptors not associated with sockets. The old behavior can be requested by defining the logical name DECC$SELECT_IGNORES_INVALID_FD prior to invoking the application (any equivalence string). o The bug in printf() "engine" introduced in ALPACRT07_071 kit has been fixed. The bug was that when minimal field width or precision specified in the format directive was greater than 1024, the "engine" could write beyond the end of allocated internal conversion buffer. It could happen only in X_FLOAT floating point mode (/L_DOUBLE_SIZE=128, which is the default on Alpha). The bug affected all functions from the printf() family of functions. o The problem commonly known as the "Y2038 bug" has been fixed. The C run-time library time functions which access the current time using the VMS time functions have been corrected to handle times after 19-Jan-2038 3:14:07. Data type time_t is defined on VMS as an unsigned 32-bit integer. However, some of the functions which retrieve current time from the system and convert it to time_t format were using signed arithmetic. This fix affects the functions: o decc$fix_time() o time() o ftime() o gettimeofday() o getclock() With this fix, DEC C RTL time functions will handle times successfully until 07-Feb-2106 06:28:15. o The printf() family of functions have been enhanced to perform better when the calling application has exhausted available memory. o The file access functions have been corrected to process file names on UNIX systems over DECnet. The file name for a file on a UNIX system accessed over DECnet was being converted to uppercase, even when the name was enclosed in double quotes. This problem was introduced on OpenVMS V7.2 and also affects OpenVMS V7.1-2 and OpenVMS V7.2-1. File names of the form node::"dir/name" are now processed correctly. -- COVER LETTER -- Page 10 11 August 2000 7 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. 8 INSTALLATION INSTRUCTIONS: Install this kit with the POLYCENTER Software Installation Utility by logging into the SYSTEM account, and typing the following at the DCL prompt: PRODUCT INSTALL VMS721_ACRTL /SOURCE=[kit location] The kit location may be a tape drive, CD, or a disk directory that contains the kit. If /SOURCE is not specified, the utility searches in the location defined by the logical name PCSI$SOURCE. If PCSI$SOURCE is not defined, and the /SOURCE qualifier is not specified, the POLYCENTER Software Installation utility searches the current default directory. 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 systems. The new image will not take effect until the system is rebooted. Copyright (c) Compaq Computer Corporation, 2000 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 -- COVER LETTER -- Page 11 11 August 2000 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.