From a501fe75036362f1f9b4588c38e74cf66e7bc5de Mon Sep 17 00:00:00 2001 From: Manuel Hutter <manuel.hutter@vshn.ch> Date: Tue, 23 Oct 2018 13:09:04 +0200 Subject: [PATCH] Avoid segfault when a resource is missing In cases where a server or SSH key is removed from Hetzner Cloud manually, the driver would segfault due to nil pointer references. This commit handles cases where no resource is returned from the API. --- driver.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/driver.go b/driver.go index 76f5d82..66778d2 100644 --- a/driver.go +++ b/driver.go @@ -322,6 +322,9 @@ func (d *Driver) GetState() (state.State, error) { if err != nil { return state.None, errors.Wrap(err, "could not get server by ID") } + if srv == nil { + return state.None, errors.New("server not found") + } switch srv.Status { case hcloud.ServerStatusInitializing: @@ -357,6 +360,10 @@ func (d *Driver) Remove() error { if err != nil { return errors.Wrap(err, "could not get ssh key") } + if key == nil { + log.Infof(" -> SSH key does not exist anymore") + return nil + } log.Infof(" -> Destroying SSHKey %s[%d]...", key.Name, key.ID) @@ -373,6 +380,9 @@ func (d *Driver) Restart() error { if err != nil { return errors.Wrap(err, "could not get server handle") } + if srv == nil { + return errors.New("server not found") + } act, _, err := d.getClient().Server.Reboot(context.Background(), srv) if err != nil { @@ -389,6 +399,9 @@ func (d *Driver) Start() error { if err != nil { return errors.Wrap(err, "could not get server handle") } + if srv == nil { + return errors.New("server not found") + } act, _, err := d.getClient().Server.Poweron(context.Background(), srv) if err != nil { @@ -405,6 +418,9 @@ func (d *Driver) Stop() error { if err != nil { return errors.Wrap(err, "could not get server handle") } + if srv == nil { + return errors.New("server not found") + } act, _, err := d.getClient().Server.Shutdown(context.Background(), srv) if err != nil { @@ -421,6 +437,9 @@ func (d *Driver) Kill() error { if err != nil { return errors.Wrap(err, "could not get server handle") } + if srv == nil { + return errors.New("server not found") + } act, _, err := d.getClient().Server.Poweroff(context.Background(), srv) if err != nil { -- GitLab