--- /dev/null
+diff -Nru rpm-4.1/lib/rpmrc.c rpm-4.1.new/lib/rpmrc.c
+--- rpm-4.1/lib/rpmrc.c Tue Aug 20 16:53:44 2002
++++ rpm-4.1.new/lib/rpmrc.c Tue Mar 11 18:41:48 2003
+@@ -1756,27 +1756,40 @@
+ /* Expand ~/ to $HOME/ */
+ fn[0] = '\0';
+ if (r[0] == '~' && r[1] == '/') {
++ const char * etc_dir = getenv("ETC_DIR");
+ const char * home = getenv("HOME");
+- if (home == NULL) {
++ if (etc_dir) {
++ if (strlen(etc_dir) > (sizeof(fn) - strlen(r))) {
++ rpmError(RPMERR_RPMRC, _("Cannot read %s, ETC_DIR is too large.\n"),r);
++ rc = 1;
++ break;
++ }
++ strcpy(fn, etc_dir);
++ strncat(fn, "/", sizeof(fn) - strlen(fn));
++ r+=2;
++
++ if (r[0] == '.') r++;
++ } else {
++ if (home == NULL) {
+ /* XXX Only /usr/lib/rpm/rpmrc must exist in default rcfiles list */
+- if (rcfiles == defrcfiles && myrcfiles != r)
+- continue;
+- rpmError(RPMERR_RPMRC, _("Cannot expand %s\n"), r);
+- rc = 1;
+- break;
+- }
+- if (strlen(home) > (sizeof(fn) - strlen(r))) {
+- rpmError(RPMERR_RPMRC, _("Cannot read %s, HOME is too large.\n"),
++ if (rcfiles == defrcfiles && myrcfiles != r)
++ continue;
++ rpmError(RPMERR_RPMRC, _("Cannot expand %s\n"), r);
++ rc = 1;
++ break;
++ }
++ if (strlen(home) > (sizeof(fn) - strlen(r))) {
++ rpmError(RPMERR_RPMRC, _("Cannot read %s, HOME is too large.\n"),
+ r);
+- rc = 1;
+- break;
+- }
+- strcpy(fn, home);
+- r++;
+- }
+- strncat(fn, r, sizeof(fn) - (strlen(fn) + 1));
+- fn[sizeof(fn)-1] = '\0';
+-
++ rc = 1;
++ break;
++ }
++ strcpy(fn, home);
++ r++;
++ }
++ }
++ strncat(fn, r, sizeof(fn) - (strlen(fn) + 1));
++ fn[sizeof(fn)-1] = '\0';
+ /* Read another rcfile */
+ fd = Fopen(fn, "r.fpio");
+ if (fd == NULL || Ferror(fd)) {
+diff -Nru rpm-4.1/rpmio/macro.c rpm-4.1.new/rpmio/macro.c
+--- rpm-4.1/rpmio/macro.c Tue Sep 17 14:58:23 2002
++++ rpm-4.1.new/rpmio/macro.c Tue Mar 11 18:21:59 2003
+@@ -1614,15 +1614,23 @@
+ buf[0] = '\0';
+ if (mfile[0] == '~' && mfile[1] == '/') {
+ char *home;
+- if ((home = getenv("HOME")) != NULL) {
+- mfile += 2;
+- strncpy(buf, home, sizeof(buf));
+- strncat(buf, "/", sizeof(buf) - strlen(buf));
++ char *etc_dir = getenv("ETC_DIR");
++
++ if (etc_dir) {
++ mfile += 2;
++ if (mfile[0] == '.') mfile++;
++ strncpy(buf, etc_dir, sizeof(buf));
++ strncat(buf, "/", sizeof(buf) - strlen(buf));
++ } else {
++ if ((home = getenv("HOME")) != NULL) {
++ mfile += 2;
++ strncpy(buf, home, sizeof(buf));
++ strncat(buf, "/", sizeof(buf) - strlen(buf));
+ }
++ }
+ }
+ strncat(buf, mfile, sizeof(buf) - strlen(buf));
+ buf[sizeof(buf)-1] = '\0';
+-
+ fd = Fopen(buf, "r.fpio");
+ if (fd == NULL || Ferror(fd)) {
+ if (fd) (void) Fclose(fd);