From time to time, ports/security/vuxml/vuln.xml gets a date field containing an invalid date. FreshPorts stores these entries in a table that looks like this:
freshports.org=# \d vuxml
Table "public.vuxml"
Column | Type | Modifiers
----------------+--------------+----------------------------------------------------
id | integer | not null default nextval('vuxml_id_seq'::regclass)
vid | text | not null
topic | text | not null
description | text | not null
date_discovery | text |
date_entry | text |
date_modified | text |
status | character(1) | not null
Indexes:
"vuxml_pkey" PRIMARY KEY, btree (id)
Referenced by:
TABLE "vuxml_affected" CONSTRAINT "$1"
FOREIGN KEY (vuxml_id) REFERENCES vuxml(id)
ON UPDATE CASCADE ON DELETE CASCADE
TABLE "commit_log_ports_vuxml" CONSTRAINT "$1"
FOREIGN KEY (vuxml_id) REFERENCES vuxml(id)
ON UPDATE CASCADE ON DELETE CASCADE
TABLE "vuxml_references" CONSTRAINT "$1"
FOREIGN KEY (vuxml_id) REFERENCES vuxml(id)
ON UPDATE CASCADE ON DELETE CASCADE
freshports.org=#
Of note is the three fields stored as TEXT values:
- date_discovery
- date_entry
- date_modifed
I do not know why this table was designed with text values. They should be date fields. But because they are text, errors such as this can slip in:
<discovery>2011-03-FIXME</discovery>
FreshPorts happily stores these values, but will later encounter a problem:
This message was generated by the FreshPorts Daemon.
The database is freshports.org
at http://www.freshports.org/
Could not execute SQL statement
--
SELECT count(DISTINCT CLPV.port_id) AS ports,
count(DISTINCT V.id) AS vulns
FROM commit_log_ports_vuxml CLPV, vuxml V
WHERE CLPV.vuxml_id = V.id
AND greatest(V.date_modified, V.date_entry, V.date_discovery)::date >= (current_date - interval '14 days')::date
--
... maybe invalid?
--
hugs+kisses
FreshPorts Daemon
The above SQL was created quite some time after the table was designed an in use.
I recently converted the vuxml table in my development copy of FreshPorts:
freshports.org=# begin; BEGIN freshports.org=# alter table vuxml alter column date_discovery type date using date_discovery::date; ALTER TABLE freshports.org=# alter table vuxml alter column date_entry type date using date_entry::date; ALTER TABLE freshports.org=# alter table vuxml alter column date_modified type date using date_modified::date; ALTER TABLE freshports.org=# commit; COMMIT
I’ll monitor how things go.












Today it caught another 2011-03-FIXME. At least it caught it at commit phase instead of later. Soon, I’ll write the code to notify the committer instead of just me.